mysql计算性能

4 mysql sql query-optimization aggregate-functions

select count(*) from mytable;
select count(table_id) from mytable; //table_id is the primary_key

这两个查询在一个包含1000万行的表上运行缓慢.我想知道为什么mysql不容易保持一个在所有插入,更新和删除更新的计数器?
有没有办法改善这个查询?我用过解释但没多大帮助.

Max*_*xym 7

看看以下博文:

1)COUNT(***)vs COUNT(col)
2)简单的MySQL性能提示
3)InnoDB的快速计数(*)

顺便问一下,你使用哪种引擎?

编辑:关于在需要知道是否有一些行数时加速计数的技术.对不起,我的查询错了.因此,当您需要知道时,如果特定条件下有300行,您可以尝试子查询:

select count(*) FROM
( select 1 FROM _table_ WHERE _conditions_ LIMIT 300 ) AS result
Run Code Online (Sandbox Code Playgroud)

首先你缩小结果集,然后计算结果; 它仍然会扫描结果集,但你可以限制它(再一次,当DB的问题是"在这里多于或少于300行时它是有效的",如果DB包含超过300行满足条件,查询更快

测试结果(我的表有6.7mln行):

1)SELECT count(*) FROM _table_ WHERE START_DATE > '2011-02-01'
返回4.2mln,持续65.4秒

2)SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result
返回100 0.03秒

下面是解释查询的结果,看看那里发生了什么:

EXPLAIN SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述