对于具有相同 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 ,但仍然没有什么区别。
答案 0 :(得分:1)
确定
select count(*)
应该比
快select *
count(*),count(field),count(主键),count(any)都相同。
您的explain
明确指出,优化器以某种方式使用count(*)
的索引,而不是将索引用作延迟的主要原因。
消除外键。
答案 1 :(得分:0)
尝试
select count(PRIKEYFIELD) from detailtable where maintableid = 999
答案 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;