4 MySQL学习---MySQL索引( 六 )


  • 将查询得到的辅助索引键值存放于一个缓存中 , 这时缓存中的数据是根据辅助索引键值排序的 。
  • 将缓存中的键值根据RowID进行排序 。
  • 根据RowID的排序顺序来访问实际的数据文件 。
Index Condition PushDown(ICP)优化和Muiti-Range Read一样,Index Condition PushDown同样是MySQL5.6开始支持的一种根据索引进行查询的优化方式 。它能减少在使用辅助索引过滤where条件时的回表次数和减少MySQL Server层和引擎层的交互次数 。在索引组织表中,使用二级索引进行回表的代价相比堆表中是要高一些的 。相关文档地址:http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html
之前的MySQL数据库版本不支持Index Condition Pusddown,当进行索引查询时,首先根据索引来查找记录 , 然后再根据where条件来过滤记录 。在支持index Condition Pushdown后,MySQL数据库会在取出索引的同时 , 判断是否可以进行where条件的过滤 , 也就是将where的部分过滤操作放在了存储引擎层 。在某些查询下 , 可以大大减少上层SQL层对记录的索?。╢etch),从而提高数据库的整体性能 , 优化支持range、ref、eq_ref、ref_or_null类型的查询,选择Index Condition Pushdown优化时,可在执行计划的列Extra看到Using index condition提示 。
注意事项
  • 索引最用于一个范围列,如果查询条件中有两个或以上的范围列则无法全用到索引 。范围条件有:>、<、between、like等 。
  • 建立索引的列不能包含null值 。
  • 查询的时候,不要在索引列上做任何操作(如计算、函数、手动/自动类型转换等),会导致索引失效而转向全表扫描 。(MySQL认为这些操作会改变索引顺序)
  • 使用auto_increment关键字的列必须有索引 。(只要有索引就行)
  • 业务上具有唯一特性的字段 , 即使是多个字段的组合,也必须建成唯一索引 。
常见问题主键索引就是聚簇索引吗?答案是否定的 。
注意:聚簇索引决定了数据库的物理存储结构 , 而主键只是确定了表格逻辑组织方式 。这二者不可混为一谈 。
对于InnoDB存储引擎而言,主键毫无疑问是一个聚簇索引 。但是当一个表没有主键 , 或者没有一个索引,Innodb存储引擎会如何处理?有如下规则:
  • 如果一个主键被定义了,那么这个主键就是作为聚簇索引,有且仅有一个 。
  • 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚簇索引 。
  • 如果没有主键也没有唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增 。
  • 自增主键会把数据自动向后插入 , 避免了插入过程中的聚簇索引排序问题 。聚簇索引的排序 , 必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的 。而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生 。所以不应该修改聚簇索引 。
为什么InnoDB只在主键索引树的叶子节点存储了具体数据?为了节省存储空间,一个表中可能有多个索引,InnoDB都会给每个加了索引的字段生成索引树 , 如果每个字段的索引树多存储了具体数据,那么这个表的索引数据文件就变得非常巨大 。(数据极度冗余)
为什么MySQL不推荐使用uuid作为主键?
  • 使用自增id的内部结构
自增的主键的值是顺序的,索引InnoDB把每一条记录都存储在上一条记录的后面 。当达到页面的最大填充因子时候(InnoDB默认的最大填充因子是页的15/16,会留出1/16的空间留作以后的修改),这样做有几个好处:
(1)下一条流就会写入新的页中,一旦数据按照这种顺序的方式加载 , 主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费 。
(2)新插入的行一定会在原有的最大数据行下一行 , MySQL定位和寻址很快,不会为计算新行的位置而作出额外的消耗 。
(3)减少了页分裂和碎片的产生 。
  • 使用uuid的索引内部结构
因为uuid相对顺序的自增id来说时毫无规律可言的 , 新行的值不一定要比之前的主键的值要大,所以InnoDb无法做到总是把新行插入到索引的最后 , 而是需要为新寻找新的合适的位置从而来分配新的空间 。
这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下问题:

推荐阅读