覆盖索引、前缀索引、索引下推
"索引的出现是为了提升查询效率,就像书的目录。"
覆盖索引
上文提到了,主键索引和二级索引,主键索引的叶子节点存放的行数据,二级索引的叶子节点存放的主键。此时,表中字段有id,name,age,id是主键索引,name是二级索引。当查询需要查询周Bob的年龄的时候,则会需要进行回表查询。回表查询自然是可以进行优化的一项。
所谓覆盖索引,就是查询的需求覆盖了索引。避免进行回表查询。
联合索引
还是上面的例子,name字段上建立了二级索引,需要查询name为"周Bob",并且按照age进行排序。如果没有联合索引,查询的步骤是,先在name索引树上查找出所有周Bob的id,进行回表查询出age,然后进行排序。如果在name和age上建立了联合索引,则不需要进行回表。
联合索引的创建规范,首先应该遵循,索引复用原则,上面的例子,name和age,会进行单独使用name查询,所以联合索引的顺序是name,age。如果age也会进行单独查询,那么就考虑空间占用,name字段比age字段所占用空间大,所以顺序还是name,age,然后在age上建立单独索引。
最左前缀原则
最左前缀原则,指的是,使用联合索引的时候,索引必须是最左起N个索引。经过实验得出,联合索引abcd,必须是ab或者abc或者abcd,才会走联合索引。如果是ac或者ad只会走索引a,而利用不到索引c或者d。如果是不包括a,则不会走索引!
索引下推
对于name和age的联合索引,当查询条件是name like "周%" and age = 10的时候,如果没有索引下推的话,MySQL会先查询出所有周%的主键,然后根据主键回表查询,找出age=10的数据。如果有索引下推的话,则查询出周%之后然后利用age索引进行一层过滤。
总结
本文提到的覆盖索引、联合索引、前缀索引、索引下推,都是为了优化索引查询而生。