【发布时间】:2021-02-05 07:11:22
【问题描述】:
我是 SQL 新手,有一个关于优化的一般性问题。
根据您的个人经验,为了编写优化查询,我应该考虑哪些事项? 是否有任何特定的命令(例如 JOIN、CASE)我应该尽可能地尝试特权或避免?另外,您如何衡量查询效率?
很抱歉这个开放性问题,我只是想围绕这个主题来思考一下,并且很想听听有经验的人的意见。
问候
【问题讨论】:
标签: mysql sql database postgresql query-optimization
我是 SQL 新手,有一个关于优化的一般性问题。
根据您的个人经验,为了编写优化查询,我应该考虑哪些事项? 是否有任何特定的命令(例如 JOIN、CASE)我应该尽可能地尝试特权或避免?另外,您如何衡量查询效率?
很抱歉这个开放性问题,我只是想围绕这个主题来思考一下,并且很想听听有经验的人的意见。
问候
【问题讨论】:
标签: mysql sql database postgresql query-optimization
“效率”是指用最少的努力完成一个目标。所以什么是有效的取决于目标,你不能说“如果查询不到十分之一秒,查询就会有效地执行”。从本质上讲,如果没有更快的方法来完成任务,则查询是有效的。
另一种更实用的方法是使查询足够高效。如果它完成了您希望它执行的操作,并且执行时间和资源使用符合您的目的,请不要担心。您还应该考虑将查询优化到理论上的最优值(例如,通过创建专门的索引)可能会对系统的其他部分产生负面影响(例如,数据修改变得更慢)。您希望优化系统的整体性能和资源使用情况。
话虽如此,应该清楚的是,没有简单的清单可以让您通过工作来确保效率。但我可以为您提供一个简短的 SQL 反模式列表,根据我的经验,这些反模式通常会导致查询效率低下:
除非您确定它是必需的,否则不要使用DISTINCT。它通常需要排序,这对于大型集合来说非常昂贵。
Avoid OR in WHERE conditions.倾向于阻止索引被使用。
仅当您确定内部联接不起作用时才使用外部联接。数据库重新排列此类连接的可能性较小。
使用标准化数据模型。不要陷入在数据库中使用数组或 JSON 的陷阱。
使用UNION ALL 而不是UNION,除非您需要消除重复。这类似于DISTINCT。
使用WHERE EXISTS (/* subquery */) 而不是WHERE x IN (/* subquery */)。 IN 总是可以重写为EXISTS,而PostgreSQL 优化器更擅长处理后者。
这些规则应该被理解为经验法则。
【讨论】: