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 就可以了。我个人不赞成existscount(*) 选项。我更喜欢count(ID),因为您通常会在ID 上有一个索引,所以我希望它运行得相当快。可以肯定的是,你必须给它们计时(在一张非常大的桌子上)——我希望它们从最快到最慢出现 existslimit 1count(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

LINQ Any vs Exists 性能 [重复]

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性能分析(十八)

SQL EXISTS vs. Aggregate IS NOT NULL