SQL性能下降原因
SQl性能下降会导致执行时间长,等待时间长。
导致SQL性能下降的原因有4点:
- 查询语句写的不好
- 索引失效
- 关联查询,太多join
- 服务器调优以及各个参数设置,比如缓冲、线程等
索引简介
索引是帮助MySQl高效获取数据的数据结构,索引是数据结构。索引的目的在于提高查询效率,在这些数据结构的基础上实现高级查找算法。
索引本身很大,往往以索引文件的形式存储在磁盘上,一般索引都是B树结构、B+树结构、哈希结构。
索引优缺点
索引优点:
- 降低数据库的IO开销,提高检索效率后,读取的数据少了
- 降低CPU的消耗,排序的时候直接通过索引排序
索引缺点:
- 索引也要占用空间
- 提高了查询速度,降低了更新表的速度,更新数据的同时,还要对其建立索引,因此速度慢了
- 很难建立最优的索引
索引分类
- 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,允许有空值
- 复合索引:一个索引包含多个列
建立索引的情况
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该建立索引
- 查询中与其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合建立索引,每次更新数据需要更新索引
- where条件里用不到的字段不创建字段
- 查询中要排序的字段,排序字段通过索引,会提高排序速度
其中,表记录太少(百万以下),频繁更新的表,数据重复且分布平均的字段,这些情况不适合建立索引。
索引优化
避免范围查询,会使索引失效。等值查询是最优的。多表查询时,小表驱动大表,小表建立索引。尽量使用覆盖索引,只访问索引的查询。
索引失效情况
- 最佳左前缀法则,如果索引多列,要遵守最左前缀法则,查询从最左前列开始,否则索引失效。如果查询字段跳过索引中间列,会造成索引部分使用,部分失效。
- 不在索引列上做任何操作,计算,函数等,会导致索引失效而转向全表扫描。
- 范围查询会使索引失效。
- 使用!=和<>的时候会使索引失效导致全表扫描
- is null,is not null也会使索引失效
- like'%string',%开头会使索引失效,可以放右边。或覆盖索引,避免索引失效。
- 字符串不加单引号,索引失效
- or连接时,索引失效