如何判断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 BYORDER BY -- 当两者都存在但不同时:通常需要两种排序。
  • 通常每个 SELECT.
  • 只使用一个索引
  • OR 几乎总是效率低下。切换到 UNION 可以有效地使用多个索引。
  • UNION ALL,有一些限制,比 UNION DISTINCT 更有效(因为去重过程)
  • 非可搜索表达式不能使用索引,因此效率极低。
  • 如果整个 WHEREGROUP BYORDER 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 来获得可用的时间。

给我一堆问题;如果有的话,我会指出每一个的复杂性。