0365ln-MemoryStructuresOn-DiskStructures打钉王耀File-Per-TableBufferPoolTablespacesSystemTablespaceinnodbfilepertable-On(ibdata1)DIRECTInnoDBDATat1.ibot2.iboOperatingSystemCacheDictionary元AdaptiveHashlhdexDoublewriteBufferPo直--------ChangeBufferGeneralTablespacesUndoLogsts1.ibots2.iboUndoTablespacest6t7t80365ChangeBufferundo001365undo_002钉钉王辉LogBufferTemporaryTablespaceRedoLogiblogfileoibtmp1王耀iblogfile1咕沧学院63650365 image.png
-
多版本并发控制MVCC 是实现事务隔离级别的一种方式,用于已提交读和可重复读。 新开启一个事务会分配一个sys_id系统版本id,只能读取小于该事务id的快照(已提交)。数据快照是在增删改时产生的,会保存在undo log中,有trx_id表示事务开始时的系统版本号,1bit的del字段,表示是否删除,还会有一个roll_ptr指针指向这条数据上一个快照。MVCC中还维护了一个ReadView,是一个未提交事务id的list。如果当前事务id<最小未提交事务id,那么该数据可以读。如果当前事务>的话,不能,如果在此中间再做详细判断。如果最后发现不能读,则通过roll_ptr回溯,找到可以读的快照,返回。
-
Next-key lock Innodb的一种实现。在可重复读级别下解决了幻读问题。没使用索引锁全表,命中索引会行锁,没命中索引间隙,命中一段索引,临键锁,左开右闭。
-
innodb索引 B+树,有更低的树高,一个节点为一页大小,一次I/O就能完全载入一个节点。再加上磁盘可以预读相邻节点,利用预读的特性,相邻的节点也被载入了。主键索引的叶子节点挂整行数据信息,聚簇索引。其他索引是非聚簇索引,叶子节点挂的是主键信息,要回表查主键索引,找到对应的行。但是如果非叶子节点的值满足的话,就是覆盖索引了,不需要回表查询。 快速插入-插入缓存 快速读取-自适应hash
索引不生效: 索引列使用函数,字符串不加引号,出现隐式转换 4. mysql崩溃恢复 依赖redo log。如果开启了bin log,redo log有半提交状态,写入binlog才变化才能已提交状态。恢复时,看Redo log和binlog有没有日志,binlog有日志就恢复,提交redolog,binlog没日志但是redolog有,就删除。
-
一条查询sql如何执行 连接鞋033预处理查询缓解析器客户端器存王耀/0365老师执行计划查询优化器执行引擎0365贴钉/生凝0365王耀/0365存储引擎 image.png
-
redo log 1 redo log是innodb存储引擎实现的,并不是所有存储引擎都有。支持崩溃恢复是Innodb的 特性。 2 redo log不是记录数据页更新之后的状态,而是记录"在某一个数据页上做了什么修改"的物理日志。 3 redo log大小是固定的,前面内容会被覆盖,一旦写满,就会触发buffer pool到磁盘的同步。
部分写失效: redo log页16k,centos 4k,可能出现部分写成功,然后宕机。用double write解决,
-
BufferPool缓冲策略 默认128M,存储索引,数据 预读机制: 1 顺序访问(相邻64个page作为一个区,如果顺序访问了区中的page,会接着预读) 2 随机预读(当前页数据超过一定数量就全读出来) 淘汰策略: 冷热索引,热区 5/8,冷区 3/8,可调整。热区前1/4的被访问不会移动位置,后3/4被访问会调到头。刚开始数据在冷区出生,默认1s有个配置,1s刷一次放到热区,避免数据污染。
-
数据库事务隔离级别 隔离级别 问题 Read-Uncommited 不可提交读
Read-Commited 可提交读 避免脏读,会不可重复读和幻读 Repeatable-Read 可重复读 避免脏读、不可重复的,会幻读 Serializable 串行化 串行化读,效率慢。都解决。 脏读:1 增删改查 未提交 2 读到未提交数据,1回滚,2脏读 不可重复读:1 读了两次,再中间过程 2进行了修改,1两次读不一致 幻读:1 批量修改 2 增了一个行 1 丢失对新增数据修改
- groupby 松散索引 where gourp_id<10 group by group_id,user_id 紧凑索引 where gourp_id=10 group by user_id 临时表 没用上索引 把值捞出来,然后统计