对于相同的“where”子句,select count(*)比select *长得多

时间:2014-02-02 23:54:10

标签: mysql

对于具有相同 where 子句的查询,我发现选择计数(*)花费的时间远远超过 select * 。< / p>

该表格有大约220万条记录(称之为详细信息表)。它有一个外键字段链接到另一个表( maintable )。

此查询大约需要10-15秒:

select count(*) from detailtable where maintableid = 999

但这需要一秒钟或更短时间:

select * from detailtable where maintableid = 999

更新 - 有人要求指定所涉及的记录数。这是150。

更新2 以下是使用 EXPLAIN 关键字时的信息。

对于 SELECT COUNT(*) EXTRA 列报告:

Using where; Using index

KEY 可能的密钥都有外键约束作为其值。

对于 SELECT * 查询,除了 EXTRA 之外,一切都是相同的:

Using Where

更新3 尝试 OPTIMIZE TABLE ,但仍然没有什么区别。

6 个答案:

答案 0 :(得分:1)

确定

select count(*)

应该比

select *

count(*),count(field),count(主键),count(any)都相同。

您的explain明确指出,优化器以某种方式使用count(*)的索引,而不是将索引用作延迟的主要原因。

消除外键。

答案 1 :(得分:0)

尝试

select count(PRIKEYFIELD) from detailtable where maintableid = 999
  1. count(*)将获取表中的所有数据,然后计算行数意味着它还有更多工作要做。
  2. 使用主键字段意味着它正在使用其索引,并且应该运行得更快。

答案 2 :(得分:0)

Thread Necro!

疯狂的主意...在某些情况下,取决于查询计划器和表大小等,使用索引实际上可能比不使用索引慢。因此,如果在不使用索引的情况下获得计数,则实际上可能会更快。

尝试一下:

SELECT count(*) 
  FROM detailtable 
 USING INDEX ()
 WHERE maintableid = 999

答案 3 :(得分:0)

SELECT count(*)

仅使用该语法就没有问题,您可以对任何表执行此操作。 您的方案中的主要问题是正确使用INDEX并在搜索中应用[WHERE]子句。 如果有机会,请尝试重新配置索引。

如果表太大,是的,可能需要一些时间。尝试检查MyISAM锁定文章。

答案 4 :(得分:0)

由于该表有220万条记录,因此计数可能要花费一些时间。从技术上讲,MySQL应该找到记录,然后对它们进行计数。这是一项额外的操作,对数百万条记录而言意义重大。使其更快的唯一方法是将结果缓存在另一个表中,并在后台进行更新。

答案 5 :(得分:-1)

或者只是尝试

select count(1) from table_name where _condition;

select count('x') from table_name where _condition;