MySQL索引优化

SQL性能下降原因

SQl性能下降会导致执行时间长,等待时间长。

导致SQL性能下降的原因有4点:

  • 查询语句写的不好
  • 索引失效
  • 关联查询,太多join
  • 服务器调优以及各个参数设置,比如缓冲、线程等

索引简介

索引是帮助MySQl高效获取数据的数据结构,索引是数据结构。索引的目的在于提高查询效率,在这些数据结构的基础上实现高级查找算法。

索引本身很大,往往以索引文件的形式存储在磁盘上,一般索引都是B树结构、B+树结构、哈希结构。

索引优缺点

索引优点:

  • 降低数据库的IO开销,提高检索效率后,读取的数据少了
  • 降低CPU的消耗,排序的时候直接通过索引排序

索引缺点:

  • 索引也要占用空间
  • 提高了查询速度,降低了更新表的速度,更新数据的同时,还要对其建立索引,因此速度慢了
  • 很难建立最优的索引

索引分类

  • 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
  • 唯一索引:索引列的值必须唯一,允许有空值
  • 复合索引:一个索引包含多个列

建立索引的情况

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该建立索引
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 频繁更新的字段不适合建立索引,每次更新数据需要更新索引
  5. where条件里用不到的字段不创建字段
  6. 查询中要排序的字段,排序字段通过索引,会提高排序速度

其中,表记录太少(百万以下),频繁更新的表,数据重复且分布平均的字段,这些情况不适合建立索引。

索引优化

避免范围查询,会使索引失效。等值查询是最优的。多表查询时,小表驱动大表,小表建立索引。尽量使用覆盖索引,只访问索引的查询。

索引失效情况

  1. 最佳左前缀法则,如果索引多列,要遵守最左前缀法则,查询从最左前列开始,否则索引失效。如果查询字段跳过索引中间列,会造成索引部分使用,部分失效。
  2. 不在索引列上做任何操作,计算,函数等,会导致索引失效而转向全表扫描。
  3. 范围查询会使索引失效。
  4. 使用!=和<>的时候会使索引失效导致全表扫描
  5. is null,is not null也会使索引失效
  6. like'%string',%开头会使索引失效,可以放右边。或覆盖索引,避免索引失效。
  7. 字符串不加单引号,索引失效
  8. or连接时,索引失效
posted @ 2020-03-29 10:47  Tanglement  阅读(117)  评论(0编辑  收藏  举报