我有以下two Queries:
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
的影响相同。< / p>
是否有任何差异如果我使用第一个查询 data = [
{
Points: "3",
Rating: "1.4",
Person: "Joe"
},
{
Points: "1",
Rating: "2.0",
Person: "Kay"
},
{
Points: "3",
Rating: "1.8",
Person: "Micheal"
}]
我是否可以?
答案 0 :(得分:2)
我不期待任何可衡量的表现差异。这是对t
中所有行的完整扫描,以检索列id
和col
。 (这可以是对表的扫描,也可以是覆盖索引。)
索引不能满足ORDER BY
;无论哪种方式,我们都会看到&#34;使用filesort&#34; EXPLAIN
输出中的操作。
与CONCAT
和LIKE
比较相比,平等比较的工作量可能略少。
但查询有很大不同。
CASE
表达式返回col
或NULL
的值。排序相等比较结果的查询返回1,0或NULL。
排序操作的性能可能有所不同,一个是排序整数,第二个是排序col
的任何数据类型。
使用琐碎的集合,在性能方面没有可测量的差异。
对于庞大的集合,这两个查询都可能具有可怕的性能。
我怀疑不同的查询会比任何一个选项更有效地满足规范。
但为什么我们需要ORDER BY
呢?那是LIMIT 1
。因此,我们返回id
值。这可能来自col='A'
行,或者不是。
在我们开始考虑哪个更快之前,我们应该确保我们满足规范。
我强烈怀疑规范可能会被调整为完全避免潜在的昂贵的排序操作,只返回一个id
值。
关注
此查询满足的规范并不清楚;运行此查询的原因。
为什么我们只返回一个id
值?我们想要返回&#34;匹配&#34;行的id
值。一个字符串。如果没有匹配的行,则返回表中一行的id
,其值为非NULL col
。如果没有包含非NULL col
值的行,则返回表中任何行的id
。
(问题中的第一个查询与第二个查询不同,关于案例2和3 ...在没有匹配col
值的情况下返回的行,NULL与非NULL。 )
答案 1 :(得分:1)
这种简单的结构应该足够了。你不需要复杂的东西。
如果没有where clause
,则此语句的问题在于您返回所有行,然后将结果切换为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;
将获得匹配的行,但只返回1行。所以从100万行,300行匹配然后获得第一行。
答案 2 :(得分:0)
在这两种情况下
ORDER BY
子句。 (第二种选择需要稍长时间才能进行评估。)此外,这两个查询不等于。
ORDER BY col = 'A' DESC
- 提供col='A'
首先col='A'
,行数为col=''
。如果表格中没有LIMIT 1
的任何行,可能会看到差异,即使是col='A'
。
如果你得到相同的结果,那就巧合了。
你是什么意思&#34;单词&#34;?在col
?在A
?还有别的吗?
where instr('A',col) > 0
还需要全表扫描。它将col
等于&#39; A&#39;或者&#39;&#39;。这不与测试col='A'
相同。