本文共 1998 字,大约阅读时间需要 6 分钟。
本文内容针对InnoDB中的索引进行说明。
主键索引、唯一索引、普通索引、组合索引、全文索引。
B+Tree是MySQL在B-Tree的基础上进行的一种针对自身使用特点的优化,数据从非叶子节点中剥离可以大大提高非叶子节点的存储量,从而减少IO次数,当然B+Tree的内容远远不止这些,比如叶子节点通过链表的方式连接起来,索引有序等等,本文不做太多介绍,后面会专门对B+Tree进行讲解。
聚簇索引不是一种索引的类型,而是一种数据存储的方式,聚簇索引指的就是将数据行存放在叶子节点中,非聚簇索引指的是将数据和索引分开存储,索引的叶子节点只存放对应数据行的地址。
Innodb使用的就是聚簇索引的方式,而MyISAM选择的是非聚簇索引的方式。
如果要索引中包含了所有要查询列的值,那么这次索引查询就称为覆盖索引。
在Innodb中,覆盖索引结合聚簇索引能够有效的减少数据检索量,并避免回表的产生
一般我们会建议在经常被查询的列上建立索引,但也需要注意如果该列更新比较频繁或者区分度不高(比如只有一个状态0/1的标识),那么就需要考虑是否值得建立索引了。
在更新比较频繁的列上建立索引,会降低更新时的效率,因为每次更新都需要对索引的存储进行维护。
主键查询不会触发回表查询。
注意使用覆盖索引,也可以避免回表查询。
对唯一属性的列上建立唯一索引,可以更快的检索数据。
如果phone建立的是varchar类型
select * from user where phone=13800000000; 不走索引
select * from user where phone=‘13800000000’; 走索引单表建立的索引数量建议控制在3-5个,建立太多的索引会占用过多的空间,同时也会造成插入、更新变慢,降低数据库的整体性能。
如果单列和组合索引都可以实现的情况下,建议使用组合索引,因为一个单列索引就会建立一个b+tree的存储结构,太多单列索引会占用过多的空间。
使用组合索引时需要注意最左匹配原则,避免索引失效,区分度高的列放在最左边,组合数量不宜过多。
建立索引的列最好设置不允许为null,否则有些查询可能不会走索引。
多表join的字段应当使用索引,并且必须要保持字段类型一致。
不要在索引列上进行函数或者计算操作,否则会导致索引失效
select * from table where c+1 = 2; c列有索引,也不会走索引查询
select * from table where c = 1; c列会走索引排序字段上可以建立索引。
组合索引中,范围查询时范围后面的列无法用到索引。有时候我们并不需要把列中的所有值都作为索引列来存储,可以通过计算索引列的区分度,来控制索引的长度,减少索引占用的空间,使得一次IO能够读取更多的索引列到内存中,提高索引的查询效率。
select * from table where name like ‘%zz%’
左右都有%的查询,是不会走索引的。select * from table where name like ‘zz%’
左边没有%的情况下,会走范围类型的索引。转载地址:http://ymlrb.baihongyu.com/