一、索引分类
-
Hash索引:Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。
-
平衡二叉树:时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多。
-
B树:每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。
-
B+树:所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。
二、主键索引
搜索过程:索引页 ——> 索引页 ——> 数据页

-
索引页 + 数据页组成的B+树就是聚簇索引。
-
InnoDB聚簇索引:
-
如果定义了PK,那么PK就是聚簇索引。
-
没有PK,第一个not null unique就是聚簇索引。
-
否则,自动建一个隐藏列作为聚簇索引。
-
聚簇索引叶子节点储存整行数据(就是数据页);
-
普通索引叶子节点:
-
InnoDB储存主键索引;
-
MyIsam储存行记录的指针;
三、回表与索引覆盖
-
非聚簇索引(普通索引)中只保存了索引字段的值(按照顺序排列,联合索引先按第一列排序,再按第二列……排序,全都相同,再按主键索引排序)与主键索引的值。
-
回表:Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次聚簇索引;
-
索引覆盖:将被查询的字段,建立到联合索引里去,这种查询不需要回表。
四、联合索引
-
联合索引中多列条件为OR关联时,索引不生效;
-
最左边的列必须在查询条件中,不然不生效 —— 最左匹配原则;
-
联合索引范围查询时,第一列是范围查询,后续的列再范围查询是没法走索引的,只有第一列是等值查询时,后续的列才能用范围查询。
-
groupBy+索引,效率特别高,不需要建中间表,也不需要排序;
五、索引优化技巧
-
大字段建索引时,可以只取字段的前半部分,例:
CREATE INDEX table ON dual(address(20));
-
某个值在某一列中出现比列很高时,查询优化器就会放弃索引,全表扫;比例分界线默认是30%;
-
orderBy和groupBy后的字段最好建索引,不会产生中间表;
-
隐式类型(“1”=> 1)转换会导致索引失效;
-
深分页查询时使用Limit时,先嵌套子查询,把id查出来,再通过id用where条件搜索,可以避免回表;
原文链接:http://www.cnblogs.com/zhusihua/p/14980341.html