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行。
我们尝试了其他所有方法。 这是迄今为止最快的方法。