参考答案
MySQL进行慢SQL优化:
一、MySQL进行慢SQL优化的思路
- 通过慢查询日志去寻找哪些 SQL 执行效率低。
- 使用 explain 获取低效率 SQL 的执行计划。
- 结合 SQL 与执行计划,进行分析与优化。
二、引起 SQL 查询很慢的原因,以及解决办法
1. 没有索引
解决办法:
- 根据 where 和 order by 使用比较频繁的字段创建索引,提高查询效率。
- 索引不宜过多,单表最好不要超过 6 个,索引过多会导致占用存储空间变大;insert、update 变慢。
- 删除未使用的索引。
2. 索引未生效
解决办法:
- 避免在 where 子句中对字段进行 null 值判断,创建表默认值是 NULL。尽量使用 NOT NULL,或使用特殊值,例如 0、-1。
- 避免在 where 子句中使用 != 或 <> 操作符, MySQL 只有对以下操作符才使用索引:<、<=、=、>、>=、BETWEEN、IN、非 % 开头的 LIKE。
- 避免在 where 子句中使用 or 来连接条件,可以使用 UNION 进行连接。
- 能用 union all 就不用 union,union 过滤重复数据要耗费更多的 CPU 资源。
- 避免部分 like 查询,如 ‘%ConstXiong%’。
- 避免在索引列上使用计算、函数。
- in 和 not in 慎用,能用 between 不要用 in。
- select 子句中避免使用 *。
3. 单表数据量太大
解决办法:
- 分页查询(在索引上完成排序分页操作、借助主键进行关联)
- 单表数据过大,进行分库分表
- 考虑使用非关系型数据库提高查询效率
- 全文索引场景较多,考虑使用 ElasticSearch、solr
三、提升性能的一些技巧
- 尽量使用数字型字段。
- 只需要一行数据时使用 limit 1。
- 索引尽量选择较小的列。
- 不需要的数据在 GROUP BY 之前过滤掉。
- 大部分时候 exists、not exists 比 in、not in 效率(除了子查询是小表的情况使用 in 效率比 exists 高)。
- 不确定长度的字符串字段使用 varchar/nvarchar,如使用 char/nchar 定长存储会带来空间浪费。
- 不要使用 select *,去除不需要的字段查询。
- 避免一次性查询过大的数据量。
- 使用表别名,减少多表关联解析时间。
- 多表 join 最好不超过 5 个,视图嵌套最好不超过 2 个。
- or 条件查询可以拆分成 UNION 多个查询。
- count(1) 比 count(*) 有效。
- 判断是否存在数据使用 exists 而非 count,count 用来获取数据行数。
以上,是MySQL面试题【MySQL进行慢SQL优化的优化思路、解决办法】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—