MySQLSQL优化最佳实践和建议
程序员文章站
2022-03-03 19:37:13
...
总结一下项目中经常使用的MySQL SQL优化最佳实践
1.IN查询包含的值不应过多
建议最多不超过5个,虽然MySQL对于IN做了相应的优化——IN中的常量全部存储在一个数组里面,并对这个数组进行排好序。但是如果数值较多,产生的消耗也是比较大的。
对于in(1,2,3) 这样连续的数值,可以使用between或者使用连接来替换。
2. SELECT语句务必指明字段名称
3. 当只需要一条数据的时候,使用limit 1
这样可以使得EXPLAIN中的type列达到const类型
4. 如果排序字段没有用到索引,就尽量少排序
5. 如果限制条件中其他字段没有索引,尽量少用or
很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果
6. 尽量用union all代替union
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。 union all的前提条件是两个结果集没有重复数据。
7. 区分in和exists, not in和not exists
区分in和exists主要是造成了驱动顺序的改变,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。
1.IN查询包含的值不应过多
建议最多不超过5个,虽然MySQL对于IN做了相应的优化——IN中的常量全部存储在一个数组里面,并对这个数组进行排好序。但是如果数值较多,产生的消耗也是比较大的。
对于in(1,2,3) 这样连续的数值,可以使用between或者使用连接来替换。
2. SELECT语句务必指明字段名称
3. 当只需要一条数据的时候,使用limit 1
这样可以使得EXPLAIN中的type列达到const类型
4. 如果排序字段没有用到索引,就尽量少排序
5. 如果限制条件中其他字段没有索引,尽量少用or
很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果
6. 尽量用union all代替union
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。 union all的前提条件是两个结果集没有重复数据。
7. 区分in和exists, not in和not exists
区分in和exists主要是造成了驱动顺序的改变,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。
上一篇: MySQLSQL优化最佳实践和建议
下一篇: “更新缓存” 与 淘汰缓存” 对比
推荐阅读