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不容易保持一个在所有插入,更新和删除更新的计数器?
有没有办法改善这个查询?我用过解释但没多大帮助.
看看以下博文:
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)

| 归档时间: |
|
| 查看次数: |
4388 次 |
| 最近记录: |