这两个查询之间的性能差异有多大?
How big is the difference in performance between these two Queries?
我有以下 two Queries:
SELECT id
FROM t
ORDER BY col = 'A' DESC
LIMIT 1;
AND
SELECT id
FROM t
ORDER BY CASE WHEN 'A' LIKE CONCAT(col, '%') THEN col END DESC
LIMIT 1;
使用和不使用 LIMIT 1
,两者给出相同的结果,这两个查询在性能上有什么区别? 第二个查询对多词很有用,但是对于单词,两个查询的效果相同在 ORDER
.
有什么区别如果我可以使用第一个查询 Single-Word
更好吗?
这个简单的结构应该足够了。你不需要把事情复杂化。
这个语句的问题,没有 where clause
是你 returning 所有行,然后将结果削减为 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;
将获得匹配的行,但 return 仅获得 1 行。所以从 100 万行中,300 行匹配然后得到第一个。
我预计性能不会有任何可衡量的差异。这是对 t
中所有行的完整扫描,以检索列 id
和 col
。 (这可能是 table 的扫描或覆盖索引。)
索引无法满足ORDER BY
;无论哪种方式,我们都将在 EXPLAIN
输出中看到 "Using filesort" 操作。
与 CONCAT
和 LIKE
比较相比,相等比较的工作量可能略少。
但查询明显不同。
CASE
表达式是 returning col
或 NULL
的值。对相等比较结果排序的查询是 returning 1、0 或 NULL。
排序操作的性能可能有所不同,一种是对整数进行排序,第二种是对任何数据类型 col
进行排序。
对于琐碎的集合,性能没有可测量的差异。
对于巨大的集合,两个查询的性能可能都非常糟糕。
我怀疑 不同的 查询会比任何一个选项更有效地满足规范。
但为什么我们需要 ORDER BY
?有一个LIMIT 1
。所以我们 returning 一个 id
值。这可能来自 col='A'
的行,也可能不是。
在我们为哪个更快而烦恼之前,我们应该确保我们满足规范。
我强烈怀疑可以调整规范以完全避免 一个潜在的昂贵排序操作,return 只有一个 id
值。
跟进
该查询满足的规范不明确; 运行 此查询的原因。
为什么我们 return 只输入一个 id
值?我们想要 return 一行的 id
值,即 "matches" 一个字符串。如果没有匹配的行,则 return table 中具有非 NULL col
值的行的 id
。如果没有包含非 NULL col
值的行,则 table.
中任何行的 return id
(问题中的第一个查询与第二个查询不同,关于情况 2 和 3...在没有匹配的 col
值的情况下得到 returned 的行, NULL 与非 NULL。)
在这两种情况下
- 整个table都读完了。 table越大,查询时间越长。
ORDER BY
子句对每一行进行评估。 (第二个选项的评估时间会稍微长一些。)
- 行已排序。
- 交付一排。
此外,这两个查询不等价。
ORDER BY col = 'A' DESC
-- 传递第 col='A'
行
- 另一个查询传递
col='A'
的行,然后传递 col=''
的行。
如果 table 与 col='A'
.[=22 没有任何行,您 可能 会看到差异,即使 LIMIT 1
=]
如有相同结果纯属巧合
"single-word"是什么意思?在col
?在 A
?还有别的吗?
where instr('A',col) > 0
还需要完整的 table 扫描。它会捕获等于 'A' 或 '' 的 col
。这 与测试 col='A'
不同 。
我有以下 two Queries:
SELECT id
FROM t
ORDER BY col = 'A' DESC
LIMIT 1;
AND
SELECT id
FROM t
ORDER BY CASE WHEN 'A' LIKE CONCAT(col, '%') THEN col END DESC
LIMIT 1;
使用和不使用 LIMIT 1
,两者给出相同的结果,这两个查询在性能上有什么区别? 第二个查询对多词很有用,但是对于单词,两个查询的效果相同在 ORDER
.
有什么区别如果我可以使用第一个查询 Single-Word
更好吗?
这个简单的结构应该足够了。你不需要把事情复杂化。
这个语句的问题,没有 where clause
是你 returning 所有行,然后将结果削减为 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;
将获得匹配的行,但 return 仅获得 1 行。所以从 100 万行中,300 行匹配然后得到第一个。
我预计性能不会有任何可衡量的差异。这是对 t
中所有行的完整扫描,以检索列 id
和 col
。 (这可能是 table 的扫描或覆盖索引。)
索引无法满足ORDER BY
;无论哪种方式,我们都将在 EXPLAIN
输出中看到 "Using filesort" 操作。
与 CONCAT
和 LIKE
比较相比,相等比较的工作量可能略少。
但查询明显不同。
CASE
表达式是 returning col
或 NULL
的值。对相等比较结果排序的查询是 returning 1、0 或 NULL。
排序操作的性能可能有所不同,一种是对整数进行排序,第二种是对任何数据类型 col
进行排序。
对于琐碎的集合,性能没有可测量的差异。
对于巨大的集合,两个查询的性能可能都非常糟糕。
我怀疑 不同的 查询会比任何一个选项更有效地满足规范。
但为什么我们需要 ORDER BY
?有一个LIMIT 1
。所以我们 returning 一个 id
值。这可能来自 col='A'
的行,也可能不是。
在我们为哪个更快而烦恼之前,我们应该确保我们满足规范。
我强烈怀疑可以调整规范以完全避免 一个潜在的昂贵排序操作,return 只有一个 id
值。
跟进
该查询满足的规范不明确; 运行 此查询的原因。
为什么我们 return 只输入一个 id
值?我们想要 return 一行的 id
值,即 "matches" 一个字符串。如果没有匹配的行,则 return table 中具有非 NULL col
值的行的 id
。如果没有包含非 NULL col
值的行,则 table.
id
(问题中的第一个查询与第二个查询不同,关于情况 2 和 3...在没有匹配的 col
值的情况下得到 returned 的行, NULL 与非 NULL。)
在这两种情况下
- 整个table都读完了。 table越大,查询时间越长。
ORDER BY
子句对每一行进行评估。 (第二个选项的评估时间会稍微长一些。)- 行已排序。
- 交付一排。
此外,这两个查询不等价。
ORDER BY col = 'A' DESC
-- 传递第col='A'
行- 另一个查询传递
col='A'
的行,然后传递col=''
的行。
如果 table 与 col='A'
.[=22 没有任何行,您 可能 会看到差异,即使 LIMIT 1
=]
如有相同结果纯属巧合
"single-word"是什么意思?在col
?在 A
?还有别的吗?
where instr('A',col) > 0
还需要完整的 table 扫描。它会捕获等于 'A' 或 '' 的 col
。这 与测试 col='A'
不同 。