这些ORDER BY
条款是不必要的 - 或令人困惑的,或两者兼而有之。
SELECT COUNT(*)
将返回一行(通常)。因为你有一个搜索条件,优化器可能必须对 col1 进行索引扫描(如果有一个索引以 col1 作为索引的前导列),或者进行表扫描。这是一个 O(N) 操作,其中 N 是表中的行数。
SELECT MEDIAN(col1)
还将返回一行(通常)。这将是一个 O(N) 操作,再次使用索引扫描或表扫描。
'normally' 限定词在那里,因为我不确定优化器将如何处理这些ORDER BY
子句。一种可能性是优化器将确定它是多余的并忽略它。另一种可能性是它会以某种方式将col1
您添加ORDER BY
到投影列中,将其包含在其他操作中,然后在返回结果之前将其删除。但是,这会在没有子句的情况下混合聚合和非聚合GROUP BY
- 所以我认为优化器会忽略它,或者拒绝查询。但是,我还没有用 MySQL 做过实验。
FWIW,IBM Informix Dynamic Server (IDS) 产生错误 -19828:ORDER BY 列或表达式必须在此上下文中的 SELECT 列表中。
如果没有 ORDER BY 子句,上面的分析就足够准确了。请注意,对于没有条件的 SELECT COUNT(*),服务器通常可以使用它保留的有关表的元数据在 O(1) 时间内回答查询。