为什么PostgreSQL查询性能不佳?调整配置优化SQL的技巧

索引无效?查看。
SQL 慢?测试。
低调?旋律。
硬件不好?改变。
停止维护?做吧。
监控是盲目的吗?盯。

就是这样。

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

说实话,这个问题确实让我很困扰。
5 00万的数据量,查一张表的数据需要半分钟,这会让任何人抓狂。
想想看,如果用户在页面等待那么久,体验有多好?
有趣的是,您尝试的方法非常传统。
groupby加索引,where条件组合索引,这些都是教科书级别的操作。
但是为什么添加索引后还是慢呢?我当时也很困惑。
改变distinct实际上提高了速度,但是distinct和groupby之间没有太大区别。
为何效果如此不同?这让我开始怀疑数据库统计数据是否不准确,或者是否存在一些隐藏规则。

后来你提到了sqlyog,我觉得很有趣。
为什么在sqlyog中添加limit1 000会更快?这就直接涉及到执行计划的问题。
改动前的执行计划显然走的是全表扫描的路径,根本没有使用索引。
为什么没有选择idx_end_time?我想这可能是因为 idx_end_time 和 idx_org_id、idx_mvno_id 索引冲突并且数据库优化器选择了“次优解决方案”。

最关键的是强制指定索引的操作。
说实话,我以前从来没有这样做过,但是效果很棒。
0.1 9 秒,与1 分钟相比,简直就是闪电。
这意味着什么?由此可见,数据库优化器虽然是智能的,但它并不是万能的。
有时你必须教他走哪条路。
一位同事怀疑过多的索引会造成混乱。
这个扣除是相当合理的。
idx_end_time 索引在某些条件下可能是最优的,但优化器会犹豫,因为它看到其他索引。

最新对比图展示了变更前后的执行计划。
这比一万句理论更有效。
变化前的是全表扫描,就好像没有索引一样;更改后的显然使用了 idx_end_time 树,跳过了 9 0% 的数据。
这种直观的对比确实可以让人理解为什么强制索引规范可以解决问题。

我没有亲自管理过这方面的5 00万条数据,但是这个想法绝对可靠。
有时优化实际上不是基于猜测,而是基于测试。
你试着去看,最后你找到了关键点。
这才是一个老兵应该做的。

如何优化慢 SQL ?

要查找慢 SQL,请使用慢查询日志。
EXPLAIN 查看执行计划、类型、行数等。
使用“显示个人资料”查看您的时间都花在哪里了。

索引是关键。
重写SQL,不要扫描全表。
IN 值太大会超出限制。
索引不能用于范围搜索。

你应该记住最左边的比赛。
这并不意味着它会失败。
混合排序会导致链失败。

如果数据量较大,需要清理碎片。
数据仓库用于复杂的查询。
Elasticsearch 带来安心。

当你说SQL很慢时,你具体指的是哪句话?