如何判断SQL个查询的复杂度
How to judge the complexity of SQL queries
任何解释如何判断 SQL 查询的复杂性的资源都将不胜感激。
查看有关查询执行计划的官方 MySQL 文档:
https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html
您可以使用 EXPLAIN 命令获取有关查询的更多信息。
(“复杂性”,我假设你的意思是“缓慢”?)一些提示:
- 子查询可能会或可能不会大大减慢查询速度。
GROUP BY
和 ORDER BY
-- 当两者都存在但不同时:通常需要两种排序。
- 通常每个
SELECT
. 只使用一个索引
OR
几乎总是效率低下。切换到 UNION
可以有效地使用多个索引。
UNION ALL
,有一些限制,比 UNION DISTINCT
更有效(因为去重过程)
- 非可搜索表达式不能使用索引,因此效率极低。
- 如果整个
WHERE
、GROUP BY
和 ORDER BY
都由单个索引处理,则可以有效地处理 LIMIT
。 (不然它必须把所有的东西都收集起来,排序,然后才能剥掉几行。)
- 实体-属性-值架构效率低下。
- UUID 和 GUID 在非常大的 table 上效率低下。
- 复合索引通常优于单列索引。
- “覆盖”索引稍微好一些。
- 有时,尤其是涉及到
LIMIT
时,最好将查询从里到外翻转。那是从一个子查询开始,该子查询找到您需要的少数 ids
,然后 然后 返回到相同的 table 和其他 table 以获取所需列的其余部分。
- “窗口函数”在 MySQL 8 和 MariaDB 10.2 中的实现很差。它们对于“groupwise-max”和“分层模式”很有用。在优化器改进之前,我声明它们是“复杂的”。
- 最新版本已识别“行构造函数”;以前他们是一个性能打击。
- 拥有
AUTO_INCREMENT
id 在某些情况下会影响性能;帮助别人。
EXPLAIN
(或EXPLAIN FORMAT=JSON
)告诉你现在发生了什么;它没有告诉您如何重写查询或添加什么更好的索引。
更多索引提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql 其中 link,请参阅“处理程序计数”以了解衡量特定查询复杂性的好方法。我用它来比较查询公式等,即使没有填充一个大的 table 来获得可用的时间。
给我一堆问题;如果有的话,我会指出每一个的复杂性。
任何解释如何判断 SQL 查询的复杂性的资源都将不胜感激。
查看有关查询执行计划的官方 MySQL 文档: https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html
您可以使用 EXPLAIN 命令获取有关查询的更多信息。
(“复杂性”,我假设你的意思是“缓慢”?)一些提示:
- 子查询可能会或可能不会大大减慢查询速度。
GROUP BY
和ORDER BY
-- 当两者都存在但不同时:通常需要两种排序。- 通常每个
SELECT
. 只使用一个索引
OR
几乎总是效率低下。切换到UNION
可以有效地使用多个索引。UNION ALL
,有一些限制,比UNION DISTINCT
更有效(因为去重过程)- 非可搜索表达式不能使用索引,因此效率极低。
- 如果整个
WHERE
、GROUP BY
和ORDER BY
都由单个索引处理,则可以有效地处理LIMIT
。 (不然它必须把所有的东西都收集起来,排序,然后才能剥掉几行。) - 实体-属性-值架构效率低下。
- UUID 和 GUID 在非常大的 table 上效率低下。
- 复合索引通常优于单列索引。
- “覆盖”索引稍微好一些。
- 有时,尤其是涉及到
LIMIT
时,最好将查询从里到外翻转。那是从一个子查询开始,该子查询找到您需要的少数ids
,然后 然后 返回到相同的 table 和其他 table 以获取所需列的其余部分。 - “窗口函数”在 MySQL 8 和 MariaDB 10.2 中的实现很差。它们对于“groupwise-max”和“分层模式”很有用。在优化器改进之前,我声明它们是“复杂的”。
- 最新版本已识别“行构造函数”;以前他们是一个性能打击。
- 拥有
AUTO_INCREMENT
id 在某些情况下会影响性能;帮助别人。
EXPLAIN
(或EXPLAIN FORMAT=JSON
)告诉你现在发生了什么;它没有告诉您如何重写查询或添加什么更好的索引。
更多索引提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql 其中 link,请参阅“处理程序计数”以了解衡量特定查询复杂性的好方法。我用它来比较查询公式等,即使没有填充一个大的 table 来获得可用的时间。
给我一堆问题;如果有的话,我会指出每一个的复杂性。