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

ogq8wdun  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(379)

我有以下两个问题:

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

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

这两种方法给出了相同的结果 LIMIT 1 ,这两个查询在性能上有什么不同?第二个查询对于多个单词很有用,但是对于一个单词,两个查询对另一个单词的效果相同 ORDER .
如果我使用第一个查询 Single-Word 如果可以的话?

abithluo

abithluo1#

在这两种情况下
整个表格被读取。表越大,查询所用的时间就越长。
这个 ORDER BY 子句对每一行进行求值(第二种方案的评估时间稍长。)
行被排序。
交付一行。
此外,这两个查询是不等价的。 ORDER BY col = 'A' DESC --把行送到哪里 col='A' 第一
另一个查询传递带有 col='A' ,然后用 col='' .
你可能会看到不同,即使 LIMIT 1 如果表中没有 col='A' .
如果你得到同样的结果,那是巧合。
你说的“一个字”是什么意思?在 col ? 在 A ? 还有别的吗? where instr('A',col) > 0 还需要进行全表扫描。它会抓住你的 col 等于“a”或“”。这和测试不一样 col='A' .

oiopk7p5

oiopk7p52#

这种简单的结构就足够了。你不需要把事情复杂化。
如果没有 where clause 返回所有行,然后将结果剪切为1。。这意味着要读一百万行,但要读第一行。

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;

将获取匹配的行,但只返回1行。所以从100万行,300行匹配,然后得到第一行。

wooyq4lh

wooyq4lh3#

我不期望在表现上有任何可测量的差异。这是对中所有行的完全扫描 t ,以检索列 id 以及 col . (这可以是对表的扫描,也可以是覆盖索引。)
这个 ORDER BY 不能从一个指标得到满足;无论哪种方式,我们都会在 EXPLAIN 输出。
平等比较可能比平等比较少一点工作量 CONCAT 以及 LIKE 比较。
但查询结果却大不相同。
这个 CASE 表达式返回的值 col 或者 NULL . 对相等比较结果排序的查询返回1、0或null。
排序操作的性能可能有所不同,一种是对整数进行排序,另一种是对任何数据类型进行排序 col 是。
对于琐碎的集合,没有可测量的性能差异。
对于庞大的集合,这两个查询可能都有可怕的性能。
我怀疑一个不同的查询会比这两个选项中的任何一个更有效地满足规范。
但为什么我们需要一个 ORDER BY 完全?有一个 LIMIT 1 . 所以我们要返回一个 id 价值观。可能是因为和你吵架 col='A' ,或者不是。
在我们对哪一种速度更快过于紧张之前,我们应该确保我们满足规范。
我强烈怀疑可以对规范进行调整,以完全避免潜在的昂贵排序操作,只返回一个 id 价值观。
后续行动
此查询满足的规范不明确;运行此查询的原因。
为什么我们只返回一个 id 价值?我们想退货 id “匹配”字符串的行的值。如果没有匹配的行,则返回 id 表中具有非空 col 价值观。如果没有非空的行 col 值,然后返回 id 表中任何一行的。
(问题中的第一个问题与第二个问题不同,涉及案例2和案例3。。。在不匹配的情况下返回的行 col 值,空与非空。)

相关问题