【问题标题】:SQL Tips for Query Optimization [closed]查询优化的 SQL 提示 [关闭]
【发布时间】:2021-02-05 07:11:22
【问题描述】:

我是 SQL 新手,有一个关于优化的一般性问题。

根据您的个人经验,为了编写优化查询,我应该考虑哪些事项? 是否有任何特定的命令(例如 JOIN、CASE)我应该尽可能地尝试特权或避免?另外,您如何衡量查询效率

很抱歉这个开放性问题,我只是想围绕这个主题来思考一下,并且很想听听有经验的人的意见。

问候

【问题讨论】:

    标签: mysql sql database postgresql query-optimization


    【解决方案1】:

    “效率”是指用最少的努力完成一个目标。所以什么是有效的取决于目标,你不能说“如果查询不到十分之一秒,查询就会有效地执行”。从本质上讲,如果没有更快的方法来完成任务,则查询是有效的。

    另一种更实用的方法是使查询足够高效。如果它完成了您希望它执行的操作,并且执行时间和资源使用符合您的目的,请不要担心。您还应该考虑将查询优化到理论上的最优值(例如,通过创建专门的索引)可能会对系统的其他部分产生负面影响(例如,数据修改变得更慢)。您希望优化系统的整体性能和资源使用情况。

    话虽如此,应该清楚的是,没有简单的清单可以让您通过工作来确保效率。但我可以为您提供一个简短的 SQL 反模式列表,根据我的经验,这些反模式通常会导致查询效率低下:

    • 除非您确定它是必需的,否则不要使用DISTINCT。它通常需要排序,这对于大型集合来说非常昂贵。

    • Avoid OR in WHERE conditions.倾向于阻止索引被使用。

    • 仅当您确定内部联接不起作用时才使用外部联接。数据库重新排列此类连接的可能性较小。

    • 使用标准化数据模型。不要陷入在数据库中使用数组或 JSON 的陷阱。

    • 使用UNION ALL 而不是UNION,除非您需要消除重复。这类似于DISTINCT

    • 使用WHERE EXISTS (/* subquery */) 而不是WHERE x IN (/* subquery */)IN 总是可以重写为EXISTS,而PostgreSQL 优化器更擅长处理后者。

    这些规则应该被理解为经验法则。

    【讨论】:

    • 尽管如此,在这种情况下没有一刀切的规则。这已经很有帮助了,谢谢!
    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2022-08-19
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多