如果我想检查名称,我想查看用户表下的“用户名”列中存在多少行/名称。可以说数千...数十万,我应该使用:
计数(姓名),
计数(*) 或
从用户中选择用户名,其中用户名 = 'name'
哪一个更合适?或者他们会在速度/响应方面给出相同的结果?
COUNT(*)
和 COUNT(Name)
可能会产生不同的值。 COUNT
不会包含 NULL 值,因此如果存在任何等于 NULL 的 Name 实例,它们将不会被计算在内。
COUNT(*)
也会比 Count(Name)
表现得更好。通过指定 COUNT(*)
,您可以让优化器自由地使用它想要的任何索引。通过指定 COUNT(Name)
,您将强制查询引擎使用该表,或者至少使用包含 NAME 列的索引。
COUNT(name) 或 COUNT(*) 会更快一些,因为它们不需要返回太多数据。 (请参阅 Andrew Shepherd 关于这两种形式的 COUNT 以及 COUNT() 之间语义差异的回复)。 重点是“检查名称”,这些差异与以下技巧无关紧要:除了计数之外,您还可以使用
SELECT username FROM users where username = 'name' LIMIT 1;
这将具有检查名称(存在)的效果,但一旦找到就返回。
Count(*) 会更快,因为 MySQL 引擎可以自由选择索引来计数。
如果有很多同名用户(很多行而不是一行),Select 语句会产生更多流量。
尝试所有三个并使用最好的预制件。如果它们都执行相同的操作,那么这就是过早优化的一个例子,您可能应该使用您觉得最舒服的那个,并在必要时进行调整。如果你迷信,你也可以考虑使用 count(1),我被告知这也可以带来性能优势。
我想说你应该使用 select top 1,但是你检查的用户名可能是一个索引唯一列,所以理论上计数应该执行得很好,考虑到只能有一个。