Mysql-索引
- 主键索引:表的主键为 B+Tree 的 key。
- 二级索引:二级索引的 value 是表的主键,这样做的好处是 B+Tree 的节点小,可以一次放入更多节点到内存,减少 IO 次数。缺点是需要回表:通过二级索引查到的主键,再去主键索引查需要的信息。
- 聚簇索引:索引结构和数据一起存放的索引,InnoDB 中的主键索引就属于聚簇索引。优点:不需要回表。
- 非聚簇索引:索引结构和数据分开存放的索引
- 覆盖索引:在二级索引就可以查询到用户所要的数据的索引,不需要回表。
- 联合索引:使用表中多个字段建立的索引。
最左匹配原则
联合索引中按照左边优先的顺序进行匹配,直到遇到第一个范围查询,其后边的 key 不再使用联合索引。因为优先级较高的 key 相等的情况下,优先级低的 key 才是局部有序的,当优先级较高的 key 是范围查询(>或<),优先级低的 key 是无序的,不能使用 B+Tree 查询。需要注意的是当高优先级 key 为前缀查询:">="、"<="、"bettwen and" 和 "like" 时,并不会停止匹配,低优先级的key 会用到联合索引,因为这三个范围查询都包含了高优先级的等值查询,在这个等值查询里,低优先级的 key 是有序的。
note:测试了高优先级用 "in" 查询也不会导致后边的key 停止匹配。
索引失效
- 左模糊匹配
like %xx
- 对索引列做了计算
- 正确的最左匹配原则
- 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。