Fra*_*anz 109 mysql performance
在MySQL中哪种方式计算多行应该更快?
这个:
SELECT COUNT(*) FROM ... WHERE ...
Run Code Online (Sandbox Code Playgroud)
或者,替代方案:
SELECT 1 FROM ... WHERE ...
// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()
Run Code Online (Sandbox Code Playgroud)
有人会认为第一种方法应该更快,因为这显然是数据库领域,并且在内部确定这样的事情时,数据库引擎应该比其他任何人更快.
Mār*_*dis 119
当你COUNT(*)接受计数列索引时,它将是最好的结果.带有MyISAM引擎的Mysql 实际上存储行数,每次尝试计算所有行时都不计算所有行.(基于主键的列)
使用PHP计算行不是很聪明,因为你必须将数据从mysql发送到php.为什么在mysql端可以实现相同的功能呢?
如果COUNT(*)速度很慢,则应运行EXPLAIN查询,并检查索引是否真正使用,以及它们应添加到何处.
以下不是最快的方法,但有一种情况,其中COUNT(*)并不适合 - 当您开始对结果进行分组时,您可能遇到问题,其中COUNT并不真正计算所有行.
解决方案是SQL_CALC_FOUND_ROWS.这通常在您选择行时使用,但仍需要知道总行数(例如,用于分页).选择数据行时,只需SQL_CALC_FOUND_ROWS在SELECT后附加关键字:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)
选择了所需的行后,您可以使用以下单个查询获取计数:
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
FOUND_ROWS() 必须在数据选择查询后立即调用.
总而言之,一切都归结为您拥有的条目数和WHERE语句中的条目.当有很多行(数万,数百万及更多)时,你应该注意如何使用索引.
Mag*_*Max 51
在与我的队友交谈后,里卡多告诉我们,更快的方法是:
show table status like '<TABLE NAME>' \G
Run Code Online (Sandbox Code Playgroud)
但你必须记住结果可能不准确.
您也可以从命令行使用它:
$ mysqlshow --status <DATABASE> <TABLE NAME>
Run Code Online (Sandbox Code Playgroud)
更多信息:http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html
您可以在mysqlperformanceblog上找到完整的讨论
Dan*_*vat 30
很棒的问题,很棒的答案.如果有人正在阅读此页面并错过该部分,这是一种快速回显结果的方法:
$counter = mysql_query("SELECT COUNT(*) AS id FROM table");
$num = mysql_fetch_array($counter);
$count = $num["id"];
echo("$count");
Run Code Online (Sandbox Code Playgroud)
lep*_*epe 14
这个查询(类似于bayuah发布的内容)显示了数据库中所有表计数的一个很好的总结:( Ivan Cachicatari的存储过程的简化版本,我强烈推荐).
__CODE__YOURDBNAME__CODE__ ;
例:
__CODE__
ada*_*shr 13
我一直都明白,下面会给我最快的响应时间.
SELECT COUNT(1) FROM ... WHERE ...
Run Code Online (Sandbox Code Playgroud)
如果需要获取整个结果集的计数,可以采取以下方法:
SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5;
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
这通常不会比使用更快,COUNT尽管人们可能认为情况正好相反,因为它在内部进行计算并且不会将数据发送回用户,因此怀疑性能提高.
执行这两个查询对于获取总计的分页是有利的,但对于使用WHERE子句则不是特别有用.
尝试这个:
SELECT
table_rows "Rows Count"
FROM
information_schema.tables
WHERE
table_name="Table_Name"
AND
table_schema="Database_Name";
Run Code Online (Sandbox Code Playgroud)
小智 5
我做了一些基准来比较COUNT(*)vs 的执行时间COUNT(id)(id是表的主键 - 索引).
试验次数:10*1000次查询
结果:
COUNT(*)快7%
VIEW GRAPH:benchmarkgraph
我的建议是使用: SELECT COUNT(*) FROM table
| 归档时间: |
|
| 查看次数: |
200830 次 |
| 最近记录: |