高性能mysql 高性能的索引策略

覆盖索引

  1. 如果索引中已经包含你所有查找的所有字段,就没必要回表(读磁盘查表),这就叫覆盖索引。
  2. 由于innodb使用了聚簇索引,且innodb的二级索引在叶子节点中保存了行的主键,所以若二级索引可以覆盖查询,就能省去反查主键的消耗。
  3. 覆盖索引要求索引中必须存储索引列的值,而hash索引、空间索引、全文索引都不支持存储索引列的值,所以不是所有索引都支持覆盖索引,mysql只支持btree做覆盖索引。

聚簇索引

聚簇索引将索引和数据行保存在同一个B树中,数据行和其相邻的索引紧凑的存储在一起,并实际存储在索引的叶子页中(找到了索引就找到了数据行)。

一个表只能有一个聚簇索引(因为一条记录不能在不同的叶子页中,所以位置结构是固定的)。

mysql不支持指定哪一列用作聚簇索引,但innodb一般使用主键做聚簇索引、没有设置主键就用非空唯一性索引作为聚簇索引、啥都没配就会创建一个虚拟的聚簇索引。(我们使用innodb,所以只要建表必然会构造聚簇索引)

聚簇索引的优点:

1. 由于使用Innodb就必然使用聚簇索引,所以一旦使用组合索引,可以轻易从叶子节点中获取主键。

非聚簇索引(二级索引Secondary Index)

由于一个表只能有一个聚簇索引,所以剩余的索引基本都是非聚簇索引。聚簇索引查找到对应行只需要走一遍B树,因为聚簇索引的索引和数据行同在一棵B树里且紧密相连。而非聚簇索引需要走两遍,因为非聚簇索引构建的B树里,叶子节点是主键而非数据行,所以走非聚簇索引走第一遍能获取主键,再根据主键走一遍聚簇索引构建的B树找到数据行。

索引下推

索引下推其实是一种 “根据索引,根据映射关系能直接能获取到对应行” 的优化,如果没有索引下推,mysql会全表扫描遍历索引才能找到对应的行。

若开启索引下推,如果where的部分子条件用到了索引,Mysql服务器会把这部分条件下推到存储引擎,存储引擎会检索以索引为key+对应行为value的键值对,找到对应行,返回给mysql服务器进行剩下的where子条件的筛选(using where)

索引下推可以减少存储引擎联接基础表的次数,以及mysql服务器联接存储引擎的次数。(不太明白如果没有索引下推会咋样)

经验分享 程序员 微信小程序 职场和发展