gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:57 26 4
gpt4 key购买 nike

我有以下 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 两者给出相同的结果,这两个查询在性能上有什么区别? 2nd Query 对于multiple word 很有用但是对于single-word 两个查询对ORDER 的效果是一样的>.

如果我可以使用 Single-Word1st Query 有什么区别吗?

最佳答案

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

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

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

但查询明显不同。

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

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


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

对于庞大的集合,这两个查询的性能可能会非常糟糕。

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


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

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

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


跟进

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

为什么我们只返回一个 id 值?我们想要返回“匹配”字符串的行的 id 值。如果没有匹配的行,则返回表中具有非 NULL col 值的行的 id。如果不存在具有非 NULL col 值的行,则返回表中任何行的 id

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

关于mysql - 这两个查询之间的性能差异有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com