为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL:计算行数的最快方法

MySQL:计算行数的最快方法

杨魅力 2019-11-12 10:11:28
在MySQL中,哪种方式计算行数应该更快?这个:SELECT COUNT(*) FROM ... WHERE ...或者,替代方案:SELECT 1 FROM ... WHERE ...// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()有人会认为第一种方法应该更快,因为在内部确定类似情况时,这显然是数据库领域,而数据库引擎应该比其他任何人都要快。
查看完整描述

3 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

当您COUNT(*)使用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;

选择所需的行后,可以通过以下单个查询获取计数:


SELECT FOUND_ROWS();

FOUND_ROWS() 必须在数据选择查询后立即调用。


总之,实际上,一切都取决于您有多少个条目以及WHERE语句中的内容。当有很多行(数万,数百万甚至更多)时,您应该真正注意索引的使用方式。


查看完整回答
反对 回复 2019-11-12
?
阿晨1998

TA贡献2037条经验 获得超6个赞

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


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上找到完整的讨论


查看完整回答
反对 回复 2019-11-12
?
茅侃侃

TA贡献1842条经验 获得超21个赞

此查询(与bayuah发布的内容类似)显示了数据库中所有表计数的不错摘要:(我强烈建议Ivan Cachicatari简化存储过程的版本)。


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

例:


+-----------------+---------+

| Table Name      | Rows    |

+-----------------+---------+

| some_table      |   10278 |

| other_table     |     995 |


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1386 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信