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 用来获取数据行数

给TA打赏
共{{data.count}}人
人已打赏
Java

Mysql中exists和in的区别

2020-7-31 6:18:20

Java

说一些索引失效的情况

2020-7-31 6:21:40

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索