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

时间:2018-04-19 20:39:57

标签: mysql sql query-performance

我有以下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" }] 我是否可以?

3 个答案:

答案 0 :(得分:2)

我不期待任何可衡量的表现差异。这是对t中所有行的完整扫描,以检索列idcol。 (这可以是对表的扫描,也可以是覆盖索引。)

索引不能满足ORDER BY;无论哪种方式,我们都会看到&#34;使用filesort&#34; EXPLAIN输出中的操作。

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

但查询有很大不同。

CASE表达式返回colNULL的值。排序相等比较结果的查询返回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)

在这两种情况下

  1. 读取整个表格。表越大,查询所需的时间就越长。
  2. 评估每一行的ORDER BY子句。 (第二种选择需要稍长时间才能进行评估。)
  3. 行已排序。
  4. 交付一行。
  5. 此外,这两个查询不等于

    • 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'相同。