在MySQL中,哪种计算行数的方法应该更快?

这是:

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

或者,另一种 Select :

SELECT 1 FROM ... WHERE ...

// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()

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

推荐答案

当你 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语句中的内容.当有很多行(数万行、数百万行及以上)时,您应该真正注意索引的使用方式.

Mysql相关问答推荐

mysql查询汇总数据

MySQL 8.0.28覆盖(和函数)索引未使用

如何在产品查询中插入GROUP_CONCAT?

带有值分隔的MySQL分组不起作用

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

SQL Select 最大值和平均值

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

SQL - 基本的内部连接查询

Select 不同的列,其中另一列不包含特定值

获取 TEXT 类型行的百分比

使用适配器设计模式和外观设计模式实现

MySQL IF() 函数根据指定条件执行代码块

MySQL REGEXP 在没有 BINARY 模式的情况下区分大小写?

如何按给定开始日期和结束日期的月份汇总?

MySQL 如何处理并发插入?

Laravel classloader.php 错误打开流失败:没有这样的文件或目录

ASP.NET EntityFramework 获取数据库名称

外键可以引用非唯一索引吗?

考虑到 NodeJS,MySQL 和 MySQL2 有什么区别

SQL WHERE 列 = 一切