当你 Select COUNT(*)
时,它需要计算列索引,所以这将是最好的结果.带有MyISAM引擎的MySQL实际上存储行数,它不会在每次try 计数所有行时计数所有行.(基于主键的列)
使用PHP计算行数不是很聪明,因为必须将数据从MySQL发送到PHP.为什么要在MySQL端实现同样的功能呢?
如果COUNT(*)
很慢,您应该在查询上运行EXPLAIN
,并判断是否真正使用了索引,以及应该在哪里添加索引.
以下不是fastest的方式,但有一种情况,COUNT(*)
并不真正适合——当你开始对结果进行分组时,你可能会遇到一个问题,COUNT
并没有真正统计所有行.
答案是SQL_CALC_FOUND_ROWS
.这通常用于 Select 行,但仍需要知道总行数(例如,分页时).
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
Select 所需行后,可以通过以下单个查询获得计数:
SELECT FOUND_ROWS();
必须在数据 Select 查询之后立即调用FOUND_ROWS()
.
总之,一切实际上都取决于你有多少个条目,以及WHERE语句中的内容.当有很多行(数万行、数百万行及以上)时,您应该真正注意索引的使用方式.