mysql 索引 mysql索引

mysql 索引
mysql索引

索引结构类型

  1. 聚簇索引
    1. 主键, 叶子节点包含数据行
  2. 非聚簇索引
    1. 索引列, 叶子节点为主键
    2. 使用非聚簇索引时,先通过索引列查询到主键,再通过聚簇索引查询到数据行
    3. 也成为第二索引
  3. 覆盖索引
    1. 如果select语句中的列恰好在索引的叶子节点上,则直接返回,而不用二次查询聚簇索引(当然,如果直接使用聚簇索引,那自然不会发生二次查询)或者去磁盘加载数据

索引用途类型

  1. 主键
  2. 唯一索引
  3. 外键
  4. 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

执行计划

  1. sql语句经过查询优化器后,会尽可能的匹配索引
  2. 使用explain查看sql语句涉及到的索引和锁定的行数
  3. 使用的索引越多,锁定的行数越少,则说明查询越高效

性能排查思路

  1. 使用explain查看执行的情况
  2. 如果索引和锁定行没有问题,可以尝试减少限制条件如where, group by, limit等限制行数的条件,进一步查看explain的结果
  3. 如果经过多次裁剪sql语句,仍然没有发现问题,则需要根据具体的业务,来确认场景,重新涉及表结构和查询方式
  4. 如果业务场景是写多读少的情况,则需要慎重使用索引,因为insert, delete,会导致索引重排,从而影响insert,delete的性能,需要综合业务场景,适当做取舍