MySQL:计算行数最快的方法

在MySQL中,哪种方法可以更快的计数?

这个:

SELECT COUNT(*) FROM ... WHERE ... 

或者,替代scheme:

 SELECT 1 FROM ... WHERE ... // and then count the results with a built-in function, eg in PHP mysql_num_rows() 

有人会认为,第一种方法应该更快,因为这显然是数据库领域,数据库引擎在内部确定这样的事情时应该比其他任何人都快。

当你COUNT(*)需要计算列索引,所以这将是最好的结果。 带有MyISAM引擎的Mysql实际上存储了行数,每次您尝试对所有行进行计数时,并不会计算所有行。 (基于主键的列)

使用PHP来计数行不是很聪明,因为你必须从MySQL发送数据到PHP。 为什么当你可以在mysql端实现同样的function呢?

如果COUNT(*)速度慢,则应该在查询上运行EXPLAIN ,并检查索引是否真的被使用,以及它们应该添加到哪里。


以下是不是最快的方法,但有一种情况,其中COUNT(*)不适合 – 当您开始对结果进行分组时,可能会遇到问题,其中COUNT并不真正计算所有行。

解决scheme是SQL_CALC_FOUND_ROWS 。 这通常用于select行时,但仍然需要知道总行数(例如,分页)。 当您select数据行时,只需在SELECT之后附加SQL_CALC_FOUND_ROWS关键字:

 SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0; 

在你select了需要的行之后,你可以用这个单一的查询来计数:

 SELECT FOUND_ROWS(); 

在数据select查询之后,必须立即调用FOUND_ROWS()


总而言之,所有的事情都要归结为你有多less条目以及WHERE语句中的条目。 当有很多行(数万,数百万和更多)时,你应该真正关注索引是如何被使用的。

很好的问题,很好的答案。 如果有人正在阅读本页并且缺less该部分,可以使用以下方法来回显结果:

 $counter = mysql_query("SELECT COUNT(*) AS id FROM table"); $num = mysql_fetch_array($counter); $count = $num["id"]; echo("$count"); 

在和我的队友交谈之后,里卡多告诉我们更快的方法是:

 show table status like '<TABLE NAME>' \G 

但是你必须记住,结果可能不准确。

你也可以从命令行使用它:

 $ mysqlshow --status <DATABASE> <TABLE NAME> 

更多信息: http : //dev.mysql.com/doc/refman/5.7/en/show-table-status.html

你可以在mysqlperformanceblog上find完整的讨论

我一直都明白,下面会给我最快的回应时间。

 SELECT COUNT(1) FROM ... WHERE ... 

这个查询(与bayuah发布的类似)显示了数据库中所有表计数的一个很好的总结:( Ivan Cachicatari的存储过程的简化版本,我强烈推荐)。

SELECT TABLE_NAME AS 'Table Name', TABLE_ROWS AS 'Rows' FROM information_schema.TABLES WHERE TABLES.TABLE_SCHEMA = ' YOURDBNAME'AND ' AND TABLES.TABLE_TYPE = 'BASE TABLE' ;

例:

+-----------------+---------+ | Table Name | Rows | +-----------------+---------+ | some_table | 10278 | | other_table | 995 |

如果你需要得到整个结果集的数量,你可以采取以下的方法:

 SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5; SELECT FOUND_ROWS(); 

这通常不会比使用COUNT快,尽pipe可能会认为情况正好相反,因为它在内部进行计算,并且不会将数据发送回用户,因此可能会提高性能。

做这两个查询是分页得到总计,但不是特别是使用WHERE子句。

我做了一些基准来比较COUNT(*)COUNT(id)的执行时间(id是表索引的主键)。

试用次数:10 * 1000个查询

结果: COUNT(*)更快7%

查看图表: benchmarkgraph

我的build议是使用: SELECT COUNT(*) FROM table

也许你可能要考虑做一个SELECT max(Id) - min(Id) + 1 。 这只会在你的ID是连续的,行不会被删除时才起作用。 但速度非常快。

尝试这个:

 SELECT table_rows "Rows Count" FROM information_schema.tables WHERE table_name="Table_Name" AND table_schema="Database_Name"; 

我为德国政府处理了六千万张唱片。

我们需要知道很多次的总行数。

所以我们数据库程序员决定在每个表中logging总是logging总数的logging。 我们更新了这个数字,取决于INSERT或DELETE行。

我们尝试了其他所有方法。 这是迄今为止最快的方法。