索引失效场景,sql查询优化

索引失效场景

  1. where使用了or
  2. 负向查询 != 《》,不大于,不小于,is null ,is not null
  3. 隐式类型转换,函数,表达式操作计算
  4. 内置函数,like通配符
  5. 联合索引中,where中索引列违背最左匹配原则
  6. MySQL优化器的最终选择,在sql语句中写明强制走某个索引
  7. 如果MySQL估计使用全表扫描要比使用索引快,则不使用索引
  8. 索引列不能参与计算,保持列“干净”

sql 优化

查询SQL尽量不要使用select *,而是select具体字段。
索引列不能参与计算,保持列“干净”
尽量的扩展索引,不要新建索引。
如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1
应尽量避免在where子句中使用or来连接条件
优化limit分页 id>100000
优化你的like语句 前缀索引
使用where条件限定要查询的数据,避免返回多余的行
尽量避免在索引列上使用mysql的内置函数
使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则
对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描。
如果插入数据过多,考虑批量插入。
在适当的时候,使用覆盖索引。
慎用distinct关键字
删除冗余和重复索引
如果数据量较大,优化你的修改/删除语句。避免同时修改或删除过多数据,因为会造成cpu利用率过高
where子句中考虑使用默认值代替null。
不要有超过5个以上的表连接
exist & in的合理利用小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。
尽量用 union all 替换 union
(如果使用union,不管检索结果有没有重复,都会尝试进行合并,然后在输出最终结果前进行排序。如果已知检索结果没有重复记录,使用union all 代替union,这样会提高效率。)
索引不宜太多,一般5个以内
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型
索引不适合建在有大量重复数据的字段上,如性别这类型数据库字段。
尽量避免向客户端返回过多数据量
当在SQL语句中连接多个表时,请使用表的别名,并把别名前缀于每一列上,这样语义更加清晰。
尽可能使用varchar/nvarchar 代替 char/nchar。
为了提高group by 语句的效率,可以在执行到该语句前,把不需要的记录过滤掉。
如何字段类型是字符串,where时一定用引号括起来,否则索引失效
使用explain 分析你SQL的计划 中的type system>const>eq_ref>ref>range>index>ALL
最左原则,覆盖索引,减少select 不必要的列,优化子查询

上一篇:树的应用——使用并查集解决动态连通性问题(含C++代码实现)(上篇:快速查找)


下一篇:C语言之联合(union)的妙用