MySQL中的limit vs exists vs count(*) vs count(id) [重复]
Posted
技术标签:
【中文标题】MySQL中的limit vs exists vs count(*) vs count(id) [重复]【英文标题】:limit vs exists vs count(*) vs count(id) in MySQL [duplicate] 【发布时间】:2013-11-28 15:26:27 【问题描述】:我只想知道哪个最快。
我要做的只是检查数据是否存在于表中。 我大部分时间都在使用“LIMIT”,但在您看来,或者如果您有依据,哪一个是检查数据是否存在的最快。
例子:
限制 1:
SELECT ID
FROM TABLE
WHERE ID=1 LIMIT 1;
存在:
SELECT EXISTS(
SELECT *
FROM TABLE
WHERE ID=1);
count(*):
SELECT (*)
FROM TABLE;
计数(ID):
SELECT (ID)
FROM TABLE;"
补充:我正在使用 InnoDB。
【问题讨论】:
SELECT 1 FROM <table> LIMIT 1
?
SELECT ID FROM TABLE LIMIT 1 - TABLE 是表名。 :D
【参考方案1】:
限制总是最快的,因为它会迭代表格的一行。
Exists 与 Limit 差别不大,因为你只是添加了另一个 select 语句,可以说它的效率与第一个相同。
Count 将遍历所有表并计算结果。使用count()时,mysql默认统计表的主键。我在大表中对count(id)、count()、count(field)和count(1)做了一些测试,没有太大区别。在我看来,'count' 会一直尝试统计索引,除非你统计的字段不是索引,但是很多人说我们应该使用 count(id) 而不是使用 count(*)。
在一张小桌子上,四种方式都可以正常工作。但是如果你加入一些大表,count会需要很长时间。
所以总而言之,使用的时间是 count(*) > count(id) >> exists > limit
【讨论】:
很好的解释'兄弟..:D,我客人我会坚持限制 每行迭代并不总是正确的,索引列的计数将接近即时。从 urls_old 中选择计数(*);受影响的行:0 找到的行:1 警告:0 1 次查询的持续时间:0.050 秒。从 urls_old LIMIT 1 中选择他的 ID;受影响的行:0 找到的行:1 警告:0 1 次查询的持续时间:0.047 秒。在我对 1.73 亿行的测试中,limit 1 仍然稍微快一些,但仍然没有遍历所有行。【参考方案2】:我认为他们都很好;除了我会删除WHERE ID = 1
子句。如果您清除表并开始重新插入,则 ID
1 将不存在。只需LIMIT 1
就可以了。我个人不赞成exists
和count(*)
选项。我更喜欢count(ID)
,因为您通常会在ID
上有一个索引,所以我希望它运行得相当快。可以肯定的是,你必须给它们计时(在一张非常大的桌子上)——我希望它们从最快到最慢出现 exists
、limit 1
、count(id)
、count(*)
之类的东西。 (不过,我对exists
表示怀疑——如果它真的评估了整个SELECT *
,结果可能最差。
【讨论】:
我认为 TS 想要检查表中是否存在特定行,而不是是否存在行,我假设1
只是一个示例
在那种情况下,他提供的四个陈述并非都是等价的,他应该澄清一下!
(I am in doubt about the exists though - if it actually evaluates the whole SELECT * it may come out worst).
不,exists
不评估,它完全忽略您选择的内容以上是关于MySQL中的limit vs exists vs count(*) vs count(id) [重复]的主要内容,如果未能解决你的问题,请参考以下文章
理解 Spark 解释:Collect vs Global vs Local Limit
NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server
NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server
SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)