MySQL----InnoDB索引简介

 聚集索引:
        在创建表时,加入了主键,表的结构会变成一颗平衡树结构(一般是B树),也就是说整个表变成了一个索引,这就是聚集索引。聚集索引的每个节点的关键词是主键字段,通过查找主键字段从而找到对应主键所在的行,来取得该行其他的列字段数据。(key:主键字段,value:字段所在行指针)。
        聚集索引的描述图如下:
      
       采用聚集索引的方式,不需要遍历整个表,只需要树高次的IO操作就能找到对应的数据,这大大地提升了查找的效率。然后,索引虽然提升了查找的速度,但是增删改操作会让表发生变化,相应地索引树也要发生调整,这会带来不小的性能开销,这也就是索引的副作用。
 
非聚集索引:
        非聚集索引就是由非主键建立的索引树,如果表中有多个索引树,各个索引树之间相互独立、互不关联。建立非聚集索引时,表中的相应字段会被拷贝出来,用于生成索引树,因此会增加表的体积,占一定的磁盘空间。它的建立语句是: create index 索引名 on 表(字段名)
        非聚集索引和聚集索引不同,非聚集索引查找到对应字段后,得到的value是主键值,要通过这个主键值进行聚集索引,再找到对应的行来取得数据。如下图所示:
                                      
         也就是说,非聚集索引必须要通过主键值的聚集索引才能找到数据,主键是通往真实数据的唯一通路。
 
覆盖索引(复合索引):
        覆盖索引是相对于非聚集索引而言,value值不只是主键值,还包括其他字段的值,这样的话通过覆盖索引找到字段后,可以通过value找到其对应行的其他字段,不需要再使用主键聚集索引来获取行信息。这样省略聚集索引的开销,从而大大提升了性能。
        覆盖索引的创建语句是:create index 索引名 on 表(字段名1,字段名2),如下图所示:
                                           
索引优化:
(1)前缀索引  对于 TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。前缀长度的选取则根据索引选择性来确定。
(2)多列索引  在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好,多列索引也就是覆盖索引。
(3)索引顺序  让选择性最强的索引列放在前面。
 
总结:
       总而言之,使用索引的方式大大提升了查表的性能,但是当表结构发生变化时,索引树也要做相应的调整,从而带来一定的性能开销。并且,索引树增大了表的体积,占用了一定的磁盘空间。
      有两种情况下不适合用索引:
    (1)表记录比较小,一般认为小于2000条数据的表不需要用索引;
           (2)索引选择性低时,选择性是指 不重复字段/表行数,当这个值比较小时,使用索引意义不大。
 
 参考自:
 https://www.cnblogs.com/aspwebchh/p/6652855.html
 http://blog.csdn.net/weiliangliang111/article/details/51333169
 
    
 
posted @ 2018-03-18 11:23  IvanB.G.Liu  阅读(96)  评论(0)    收藏  举报