第二种方法可能会导致长事务
可使用commit work and chain 命令提交并开启新事务
如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。
可知,普通索引需要多扫描一棵主键索引树。
页可以空或者充满,行记录会按照主键顺序来排序。
根据B树的特性,它可以自顶向下遍历,但也可以在各叶子节点水平遍历。因为每个叶子节点都有着一个指向包含下一条(顺序)记录的页的指针。
例如,页#5有指向页#6的指针,页#6有指向前一页(#5)的指针和后一页(#7)的指针
页可能填充至100%,在页填满了之后,下一页会继续接管新的记录。
分裂后 上一页存 MERGE_THRESHOLD 容量的数据。在数据挪动的过程中会影响性能。除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低大约 50%(MERGE_THRESHOLD 参数控制)
当你删了一行记录时,实际上记录并没有被物理删除,记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。
当相邻两个页由于删除了数据,利用率小于(MERGE_THRESHOLD 默认为50%)之后,会将数据页做合并
覆盖索引可以减少树的搜索次数,显著提升查询性能
使用复合索引的时候,没有使用左侧的列查找,索引失效。
对于模糊查询 以‘%’开头的会造成索引失效
以联合索引(name,age)为例
mysql> select * from tuser where name like '张 %' and age=10 and ismale=1;
在 MySQL 5.6 之前,只能从 ID3 开始一个个回表。到主键索引上找出数据行,再对比字段值。
而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件(索引字段)的记录,减少回表次数。