mysql索引
索引结构类型
- 聚簇索引
- 主键, 叶子节点包含数据行
- 非聚簇索引
- 索引列, 叶子节点为主键
- 使用非聚簇索引时,先通过索引列查询到主键,再通过聚簇索引查询到数据行
- 也成为第二索引
- 覆盖索引
- 如果select语句中的列恰好在索引的叶子节点上,则直接返回,而不用二次查询聚簇索引(当然,如果直接使用聚簇索引,那自然不会发生二次查询)或者去磁盘加载数据
索引用途类型
- 主键
- 唯一索引
- 外键
- FULLTEXT
索引匹配
1.?最左匹配原则,即(A,B,C)索引,只能加速查询满足条件为(A), (A,B), (A,B,C)的查询, (A,B,C)是与的情况,而如(A,C)这种条件,就相当于匹配到了(A)的索引
2. 范围查询 如>,<, <=>, in, between,会导致无法匹配到索引
参看:https://tech.meituan.com/2014/06/30/mysql-index.html
执行计划
- sql语句经过查询优化器后,会尽可能的匹配索引
- 使用explain查看sql语句涉及到的索引和锁定的行数
- 使用的索引越多,锁定的行数越少,则说明查询越高效
性能排查思路
- 使用explain查看执行的情况
- 如果索引和锁定行没有问题,可以尝试减少限制条件如where, group by, limit等限制行数的条件,进一步查看explain的结果
- 如果经过多次裁剪sql语句,仍然没有发现问题,则需要根据具体的业务,来确认场景,重新涉及表结构和查询方式
- 如果业务场景是写多读少的情况,则需要慎重使用索引,因为insert, delete,会导致索引重排,从而影响insert,delete的性能,需要综合业务场景,适当做取舍