声明:本文主要以Innodb存储引擎的索引介绍,MyISAM本文不做过多介绍,主要区别是MyISAM中索引和数据是分开存储的,索引每次查询都有回表操作,但是由于索引文件中存储的是数据文件的地址偏移量而不像Innodb通过索引再去聚簇索引进行一次查询,所以速度还是很快的,分场景进行选择使用。
Innodb中索引主要分为两种
1.聚簇索引:满足以下几个条件,页内的记录是按照主键大小排成的单向链表,记录页是根据记录的主键大小组成的双向链表,叶子结点存储的是完整的用户记录。
2.二级索引:非叶子节点存储的是列值+主键值+页号(这里也存主键的目的是为了让新增数据的时候不至于不知道插到哪个具体页中),叶子结点存储的是列+主键。
3.联合索引:以多个列的大小为排序规则建立的B+数索引。
索引使用的场景主要有以下几种:全值匹配,匹配左边的列,匹配列前缀,匹配范围值,精确匹配某一列并范围匹配另一列,排序,分组等。
覆盖索引:由于通过二级索引查询数据每次都需要进行回表操作,所以尽量查询索引中包含的列字段以避免回表操作提高查询效率。
设置索引时要考虑列的基数,如果基数较小也就是重复的列非常多,那么索引效果不太好,同时也需要注意索引类型,类型所占空间越小的话每个页中能存取的数据越多,一次能读取的数据也就越多,如果是字符串类型的索引可以考虑字符串值的前置。还有要注意的是索引列要在表达式中单独出现,如where id+2 > 4就不会使用到索引,会走全表扫描,而where id > 4 - 2是可以使用索引的
最左匹配原则:在联合索引中,先匹配最左列的值,如果最左边列的值再进行第二列的匹配,依次往下,如果左边列相等,右边列进行范围查询也是会用到索引。如果我们想使用更多的列,匹配条件一定是联合索引中连续的列。
我们在创建主键索引时要尽量自增,目的是为了保证数据在页中能进行顺序插入,否则的话容易出现页分裂的情况,严重影响整体性能。