mysql计数性能

mysql计数性能,sql,mysql,query-optimization,aggregate-functions,Sql,Mysql,Query Optimization,Aggregate Functions,这两个查询在一个有1000万行的表上运行缓慢。 我想知道为什么mysql不容易保存一个计数器来更新所有的插入、更新和删除操作? 有没有办法改进这个查询?我曾经解释过,但没有多大帮助。看看下面的博客帖子: 一, 2. 三, 顺便问一下,你用哪种发动机 编辑:当您只需要知道是否有一定数量的行时,关于加速计数的技术。对不起,我的问题出了问题。因此,当您只需要知道时,如果特定条件下有300行,您可以尝试子查询: select count(*) from mytable; select count(tab

这两个查询在一个有1000万行的表上运行缓慢。 我想知道为什么mysql不容易保存一个计数器来更新所有的插入、更新和删除操作?
有没有办法改进这个查询?我曾经解释过,但没有多大帮助。

看看下面的博客帖子:

一, 2. 三,

顺便问一下,你用哪种发动机

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

select count(*) from mytable; select count(table_id) from mytable; //table_id is the primary_key 首先缩小结果集,然后计算结果;它仍然会扫描结果集,但您可以再次对其进行限制,当DB的问题在这里大于或小于300行时,以及如果DB包含的行数超过300行,并且满足查询速度更快的条件时,它会工作

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

1从“表格”中选择计数*,其中开始日期>2011-02-01 返回4.2mln,持续65.4秒

2从表中选择1,其中开始日期>结果为“2011-02-01”限制100 返回100,持续0.03秒

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

select count(*) FROM
( select 1 FROM _table_ WHERE _conditions_ LIMIT 300 ) AS result

正如cherouvim在评论中指出的,这取决于存储引擎

MyISAM确实保留了表行的计数,并且可以保持准确,因为MyISAM支持的唯一锁是表锁

但是InnoDB支持事务,并且需要进行表扫描来计算行数


mytable是什么存储引擎?@cherouvim我的钱说InnoDB,因为MyISAM确实保留了一个行计数器。@Scrum Meister:我检查了它,结果是性能更好,所以它告诉我是的。。。但是等等。。我不记得我是否使用了MySQL或PostgreSQL,这很重要……正如预期的那样,您提供的限制解决方案不起作用。限行returned@TheScrum Meister:编辑,只是给出了错误的查询。现在它的工作如预期@maxym将内部查询中的_row_uu替换为类似SELECT 1的常量。你能把解释结果贴出来吗?它会先将内部查询复制到临时表吗?@Scrum Meister:当然,给我一分钟,希望InnoDB会进行完整的索引扫描,而不是完整的表scan@Mark有什么区别?由于没有WHERE,InnoDB将数据存储在主键中,indexI在有WHERE子句时考虑得更多,这在使用COUNT时可能更常见;但是索引扫描通常应该比表扫描快
EXPLAIN SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result