如果我想检查一个名称,我想查看users表下“username”列中存在多少行/名称。让我们说成千上万......我应该使用:
count(name),
count(*)或
SELECT username FROM users where username ='name'
哪一个更合适?或者他们会在速度/响应方面给出相同的结果?
编辑:
谢谢大家,我找到了答案,count()肯定会更快
此查询是否正确
SELECT COUNT( username )
FROM users
WHERE `username` = 'tim'
答案 0 :(得分:21)
COUNT(*)
和COUNT(Name)
可能会产生不同的值。 COUNT
将不包含NULL值,因此如果 Name 的任何实例等于NULL,则不会计算它们。
COUNT(*)
的效果也会优于Count(Name)
。通过指定COUNT(*)
,您可以让优化器自由使用它希望的任何索引。通过指定COUNT(Name)
,您强制查询引擎使用该表,或至少包含NAME列的索引。
答案 1 :(得分:3)
COUNT(name)或COUNT(*)会更快一些,因为它们不需要返回太多数据。 (请参阅Andrew Shepherd关于这两种形式的COUNT以及COUNT())之间语义差异的回复。重点是“检查名称”,这些差异与以下技巧无关:而不是计数你也可以使用
SELECT username FROM users where username = 'name' LIMIT 1;
这会产生检查(存在)名称的效果,但会尽快返回。
答案 2 :(得分:1)
计数(*)会更快,因为MySQL引擎可以自由选择索引进行计数。
答案 3 :(得分:0)
如果有许多具有相同名称的用户(许多行而不是一行),则Select语句会产生更多流量。
答案 4 :(得分:0)
尝试所有三种并使用最好的预制件。如果它们都是相同的预制形式,这是一个过早优化的例子,你应该只使用你觉得最舒服的那个,并在必要时稍后进行调整。如果你迷信,你也可以考虑使用count(1),我被告知也可以提供性能优势。
我会说你应该使用一个选择前1,但你检查一个用户名,这可能是一个索引的唯一列,所以理论上计数应该预先形成,考虑到只有一个。