MySQL中的限制与存在vs计数(*)与计数(id)

时间:2013-11-15 09:27:06

标签: php mysql sql database database-design

我只想知道哪一个是最快的。

我要做的就是检查表中是否存在数据。 我一直在使用“限制”,但在您看来,或者如果您有基础,哪一个检查数据是否存在最快。

示例:

限制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。

2 个答案:

答案 0 :(得分:13)

限制总是最快的,因为它迭代了表格的一行。

存在与限制几乎没有区别,因为您只需添加另一个选择语句,我们可以说它与第一个具有相同的效率。

Count将迭代所有表并计算结果。当您使用count()时,默认情况下,mysql会计算表的主键。我在大表中对count(id),count(),count(field)和count(1)进行了一些测试,没有太大的区别。在我看来,'count'将始终尝试计算索引,除非你计算的字段不是索引,但很多人说我们应该使用count(id)而不是使用count(*)。

在一张小桌子上,四种方式都可以正常工作。但是,如果你加入一些大桌子,数数将花费很长时间。

总而言之,使用的时间是 count(*)> count(id)>>存在>限

答案 1 :(得分:0)

我认为他们都很好;除了我会删除WHERE ID = 1条款。如果您清空表并开始重新插入,则ID 1将不存在。只需LIMIT 1即可。就个人而言,我不赞成existscount(*)选项。我更喜欢count(ID),因为你通常会在ID上有一个索引,所以我希望它能够相当快地运行。可以肯定的是,你必须给它们计时(在一张非常大的桌子上) - 我希望它们能够出现existslimit 1count(id)count(*)之类的内容。最快到最慢。 (我对exists有疑问 - 如果它实际上评估了整个SELECT *它可能会更糟糕。