MySQL InnoDB计数(*)与计算服务器端的行数

时间:2011-06-08 06:18:11

标签: mysql innodb

我有一个MySQL InnoDB表。我需要计算表中的行数,但是我已经读过很多计数()不能很快执行的性能调优书。使用select count()或使用Select Primary_key_column并计算服务器端的行数来计算行数会更快吗?或者还有其他方法可以计算在MySql InnoDB中不会导致性能问题的行数吗?

3 个答案:

答案 0 :(得分:2)

对于整个表MyISAM的COUNT(*) 非常快,因为它在内部保持表行数。

COUNT(*) ... WHERE ...的情况下 MyISAM InnoDB 必须真正计算匹配 行。那么速度主要取决于磁盘的数量 我需要访问行。

MyISAM 会保留表元数据的内部缓存,例如行数。这意味着,通常,COUNT(*)不会为结构良好的查询带来额外成本。然而, InnoDB 没有这样的缓存。举一个具体的例子,假设我们正在尝试对查询进行分页。如果你有一个查询SELECT * FROM users LIMIT 5,10,让我们说,使用 MyISAM 运行SELECT COUNT(*) FROM users LIMIT 5,10基本上是免费的,但与 InnoDB的第一次查询相比需要相同的时间 MySQL SQL_CALC_FOUND_ROWS选项,告诉 InnoDB 在运行查询时计算行数,然后可以通过执行SELECT FOUND_ROWS()来检索。这非常 MySQL - 特定,但在某些情况下可能是必要的,特别是如果您使用 InnoDB 来实现其他功能(例如,行级锁定,存储过程等) )。

答案 1 :(得分:1)

我说的一般 - 如果你在客户端使用count,它应该与你在服务器端运行它一样。这是因为sql语句是从clinet(或服务器)发送到数据库服务器的,它始终在服务器端执行操作。

但是,最好使用index来计算所有数据的子集,但如果要计算表中的所有数据,则索引将过时,因为db必须计算所有行。

我不知道mysql中是否有runstats实用程序。例如,在DB2中,统计信息还可以告诉表中的记录数。一旦执行了runstats,计数就会快得多。

答案 2 :(得分:1)

SELECT COUNT(*) FROM table总是比“手动”计数记录更快(比如只获取主键列并计算PHP中的数组长度)。

你读过哪本书?