这两个查询之间的性能差异有多大?

How big is the difference in performance between these two Queries?

我有以下 two Queries:

SELECT id
FROM t
ORDER BY col = 'A' DESC
LIMIT 1;

AND

SELECT id
FROM t
ORDER BY CASE WHEN 'A' LIKE CONCAT(col, '%') THEN col END DESC 
LIMIT 1;

使用和不使用 LIMIT 1,两者给出相同的结果,这两个查询在性能上有什么区别? 第二个查询多词很有用,但是对于单词,两个查询的效果相同在 ORDER.

有什么区别如果我可以使用第一个查询 Single-Word 更好吗?

这个简单的结构应该足够了。你不需要把事情复杂化。

这个语句的问题,没有 where clause 是你 returning 所有行,然后将结果削减为 1.. 这意味着要读取 100 万行但得到第一行.

SELECT id
FROM t
ORDER BY col = 'A' DESC
LIMIT 1;

或优化

SELECT id
FROM t
where instr('A',col) > 0
ORDER BY col
LIMIT 1;

将获得匹配的行,但 return 仅获得 1 行。所以从 100 万行中,300 行匹配然后得到第一个。

我预计性能不会有任何可衡量的差异。这是对 t 中所有行的完整扫描,以检索列 idcol。 (这可能是 table 的扫描或覆盖索引。)

索引无法满足ORDER BY;无论哪种方式,我们都将在 EXPLAIN 输出中看到 "Using filesort" 操作。

CONCATLIKE 比较相比,相等比较的工作量可能略少。

但查询明显不同。

CASE 表达式是 returning colNULL 的值。对相等比较结果排序的查询是 returning 1、0 或 NULL。

排序操作的性能可能有所不同,一种是对整数进行排序,第二种是对任何数据类型 col 进行排序。


对于琐碎的集合,性能没有可测量的差异。

对于巨大的集合,两个查询的性能可能都非常糟糕。

我怀疑 不同的 查询会比任何一个选项更有效地满足规范。


但为什么我们需要 ORDER BY?有一个LIMIT 1。所以我们 returning 一个 id 值。这可能来自 col='A' 的行,也可能不是。

在我们为哪个更快而烦恼之前,我们应该确保我们满足规范。

我强烈怀疑可以调整规范以完全避免 一个潜在的昂贵排序操作,return 只有一个 id 值。


跟进

该查询满足的规范不明确; 运行 此查询的原因。

为什么我们 return 只输入一个 id 值?我们想要 return 一行的 id 值,即 "matches" 一个字符串。如果没有匹配的行,则 return table 中具有非 NULL col 值的行的 id。如果没有包含非 NULL col 值的行,则 table.

中任何行的 return id

(问题中的第一个查询与第二个查询不同,关于情况 2 和 3...在没有匹配的 col 值的情况下得到 returned 的行, NULL 与非 NULL。)

在这两种情况下

  1. 整个table都读完了。 table越大,查询时间越长。
  2. ORDER BY 子句对每一行进行评估。 (第二个选项的评估时间会稍微长一些。)
  3. 行已排序。
  4. 交付一排。

此外,这两个查询等价。

  • ORDER BY col = 'A' DESC -- 传递第 col='A'
  • 另一个查询传递 col='A' 的行,然后传递 col='' 的行。

如果 table 与 col='A'.[=22 没有任何行,您 可能 会看到差异,即使 LIMIT 1 =]

如有相同结果纯属巧合

"single-word"是什么意思?在col?在 A?还有别的吗?

where instr('A',col) > 0 还需要完整的 table 扫描。它会捕获等于 'A' 或 '' 的 col。这 与测试 col='A' 不同