【发布时间】:2011-11-22 20:26:56
【问题描述】:
我想从选择查询中检索计数。
哪个更快:count(*) 或 count(table_field_name)?
我想知道哪种方式的性能更快。
【问题讨论】:
标签: mysql
我想从选择查询中检索计数。
哪个更快:count(*) 或 count(table_field_name)?
我想知道哪种方式的性能更快。
【问题讨论】:
标签: mysql
区别在于Count(field)返回字段中NOT NULL值的计数,COUNT(*)是否返回行计数。
MyIsam 中的COUNT(*) 应该更快。
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count
【讨论】:
至少在 MyISAM 表上count(*) 应该比count(fliedname) 快,因为它允许 mysql 使用索引(大多数时候是主键)来进行计数。如果给定的字段名是主键,它不会有任何区别。
使用*,mysql 不会像其他人所说的那样转储到“加载整行的数据” - count(*) 始终是最快的或最快的选项之一,而@987654327 @ 可能会慢一些,具体取决于给定的字段。
编辑:
the documantation 说:
COUNT(*) 已优化为非常快速地返回 [...]。此优化仅适用于 MyISAM 表
阅读文档以获取有关此主题的更多信息。
重要提示: count(*) 返回总行数,而 count(fieldname) 返回给定字段不是 NULL 的行数。这在逻辑上与* 一致,mysql 无法知道要忽略的NULL-values。在执行count() 时始终考虑这一点,因为它可能会对结果产生影响。
【讨论】:
count(*) 和count(primary_key) 我说的是真的不会有所作为不能有所作为,因为主键不应该为空(而且,据我所知,一个主要的不能为空,即使你尝试)。关于count(*)/count(normal_field) 我只是说count(*) 永远不会慢,这也是真的。