sql查询慢为什么cpu高

记得有一次,我在一家小公司做数据库维护。
当时,该公司刚刚安装了CRM系统,用户反映查询速度极其缓慢。
我一看,哇,那个SQL语句嵌套了三层子查询,而且还使用了全表扫描。
就像迷宫一样,CPU自然是很高的。
那天下午,我花了两个小时把查询语句简化为一句话,加了一些索引,CPU立刻就掉了。
不过,我也突然想到,如果公司能够定期对数据库进行性能分析,是不是可以避免这个问题呢?

记一次神奇的sql查询经历,group by慢查询优化(已解决)

搜索慢说明索引不正确。
idx_end_time 是关键。

5 00万条数据,3 0多秒没有索引,太离谱了。

组城市很慢,改变不同的城市实际上可以加快速度。
但根本上不是。

Sqlyog 添加限制 1 000,测量的速度是幻觉。

where条件中添加的组合索引没有用,说明没有正确完成。

解释一下,idx_end_time没有被使用。

强制指定idx_end_time,直接0.1 9 秒。

同事说索引太乱了。
idx_org_id 和 idx_mvno_id 会误导搜索。

提前1 分钟变化,晚几百毫秒变化,相差6 00多倍。

亲自看看选择正确的索引有多么重要。

男人要慢,SQL要快:记一次慢SQL优化

上周 进行缓慢的 SQL 优化。
2 02 3 年 1 0 月 2 6 日。
在线总表数据3 000万+。

这是我的朋友 发现SQL语句速度很慢。
1 1 .1 4 6 秒。
这是一个常见的慢查询。

有什么问题吗? WHERE条件过滤。
按 DESC 金额排序,按 create_time ASC 排序。

表和索引怎么样? 两个索引在一起。
(状态,to_account_id) (status, from_account_id)
但是排序字段不受保护。
amount 和 make_time 不受保护。

实施方案要点。
使用文件排序。
无需索引即可排序。

排序过程如何进行? 首先在索引中检查数据。
然后放置一个类型缓冲区。
sort_buffer_size 不够大。
只需转到磁盘并进行多路合并排序即可。
节目刚刚崩溃。

影响因素有哪些? 排序字段长度。
总数据。
缓冲区大小。

实施计划说使用文件排序是一个瓶颈。
我承认。

它是如何优化的? 调整指数结构。

问题的原因。
原始索引不覆盖排序字段。
这会导致排序返回表查找数据。

解决方案。
创建新的共享索引。
(status, amount DESC, create_time ASC)
索引设计原则。
收盘指数。
WHERE 条件字段。
Sort fields. 减少退表操作。

排序方向必须匹配。
索引中 DESC 的数量。
创建时间 ASC。
与 ORDER BY 相同。

它是如何运作的? 用于优化执行计划的附加字段。
使用索引查看。
它表明使用了收盘指数。
不需要额外的排序。

新的联合索引。
替换排序字段。

还有其他优化。
代码结构优化。

问题场景。
在 for 循环中一项一项地更新项目。
1 5 00 次免费写入操作。

解决方案。
Switch to batch updates. 例如,每 1 00 条记录。
Execute UPDATE.
How does it work? 写操作的数量。
从3 000次到3 0次。
显着降低 I/O 开销。

性能验证。
Test environment. 3 0万条数据。
优化前≥1 .5 秒。
优化后约0.4 秒。
Increases 3 to 4 times.
生产环境。
3 0 million+ data. 大约有 3 00 万条符合条件的数据。
优化前 1 1 到 1 4 秒。
优化后约0.8 秒。
增加1 0倍以上。

关键优化点总结。
Avoid failsort. 联合索引覆盖排序字段。
数据按需排序和存储。

Index design. 首先满足 WHERE 条件进行过滤。
排序字段的顺序必须一致。
排序方向也必须一致。

Group operation. 减少高频小额交易。
Reduce database load.
连接建议。
Monitor and tune. 定期分析慢查询日志。
请注意 rows_examined 和 Extra 字段。

Index maintenance. Don't over index. 定期清理未使用的索引。
Reduce write overhead.
Parameter tuning. 根据数据量调整参数。
sort_buffer_size 和 tmp_table_size。

算了。
由你决定。