我有以下两个问题:
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
如果可以的话?
3条答案
按热度按时间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'
.oiopk7p52#
这种简单的结构就足够了。你不需要把事情复杂化。
如果没有
where clause
返回所有行,然后将结果剪切为1。。这意味着要读一百万行,但要读第一行。或优化
将获取匹配的行,但只返回1行。所以从100万行,300行匹配,然后得到第一行。
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
值,空与非空。)