MYSQL计数查询的效率

MYSQL计数查询的效率,mysql,Mysql,所以我在一个表上执行了这个查询: EXPLAIN SELECT COUNT(*) FROM table; 输出中的“rows”列显示为NULL,而通常它会显示查询经过了多少行 这是否意味着COUNT命令是瞬时的,因此不需要遍历任何行 如果您的表使用MyISAM存储引擎,那么是的,该查询以固定时间解析。行计数是表元数据的一部分,不必检查表本身。如果表使用MyISAM存储引擎,则是,该查询以恒定时间解析。行计数是表元数据的一部分,不必检查表本身。许多数据库引擎使用。如果您很可能正在使用MyISAM

所以我在一个表上执行了这个查询:

EXPLAIN SELECT COUNT(*) FROM table;
输出中的“rows”列显示为NULL,而通常它会显示查询经过了多少行


这是否意味着COUNT命令是瞬时的,因此不需要遍历任何行

如果您的表使用MyISAM存储引擎,那么是的,该查询以固定时间解析。行计数是表元数据的一部分,不必检查表本身。

如果表使用MyISAM存储引擎,则是,该查询以恒定时间解析。行计数是表元数据的一部分,不必检查表本身。

许多数据库引擎使用。如果您很可能正在使用MyISAM,它只会读取引擎索引中的一个数字并返回它。几乎是瞬间的

编辑:
,因此它几乎总是比使用表索引的引擎慢,除非您将查询与WHERE子句进行比较。

许多数据库引擎使用an来获取计数。如果您很可能正在使用MyISAM,它只会读取引擎索引中的一个数字并返回它。几乎是瞬间的

编辑: ,因此它几乎总是比使用表索引的引擎慢,除非您将查询与WHERE子句进行比较。

From:

根据您使用的引擎(我猜是MyISAM),将执行快速索引计数,而不是实际计数所有行。

来自:


根据您使用的引擎(我猜是MyISAM),将执行快速索引计数,而不是实际计数所有行。

然后它可能会使用主键索引。InnoDB表的行计数不是单独存储的。解释会告诉你这一点。对于MyISAM,它会说选择表优化了,对于InnoDB,它会告诉你使用了什么索引(如果有的话),然后它可能会使用主键索引。InnoDB表的行计数不是单独存储的。解释会告诉你这一点。对于MyISAM,它会说选择表优化了,对于InnoDB,它会告诉你使用了什么索引(如果有的话)。你链接的页面与你说的相矛盾。无论是否有WHERE子句,InnoDB的方式都不同。我想你误读了。@Dan,你是对的。当我回答这个问题时已经很晚了:我已经修复了我答案中的错误。你链接的页面与你所说的相矛盾。无论是否有WHERE子句,InnoDB的方式都不同。我想你误读了。@Dan,你是对的。当我回答这个问题时已经很晚了:我已经纠正了我答案中的错误。