MySQL 4.0 没有 information_schema 和 'show table status from db ' 只给出了 innodb 表的近似行数。
那么获取innodb表计数的最快方法是什么,当然除了count(*),对于大表可能会更慢。
更新
使用 InnoDB 时,整个表中唯一准确的行数是 COUNT(*)。由于您从 4.0 升级到 5.0 只会发生一次,因此您只需要处理速度问题。
这适用于所有版本的 MySQL。正如其他评论者所指出的 - InnoDB 中没有快速的 SELECT COUNT(*) 。造成这种情况的部分原因是 InnoDB 是多版本的,这将取决于事务的上下文,一个表中应该有多少行。
有一些解决方法:
1)如果你从不删除, SELECT MAX(id) 应该返回正确的行数。
2)您可以将它们归档到“已删除行表”中,而不是删除行(现在很多人似乎都想保留所有内容)。假设删除是仍然当前的小得多的子集,您可以从 not_deleted 中的 SELECT max(id) 中减去 count(*) from deleted_rows。
3) 使用触发器。这对性能很不利。
这里有一个关于这个问题的技术讨论:http: //mysqlha.blogspot.com/2009/08/fast-count-for-innodb.html
等待!有一个快速的方法!使用触发器和元表..
CREATE TABLE meta (
`name` char(32) NOT NULL ,
`value_int` int ,
unique (name)
) ENGINE = INNODB;
insert into meta (name, value_int) values ('mytable.count', 0);
然后
set delimiter |
CREATE TRIGGER mytablecountinsert AFTER INSERT ON mytable
FOR EACH ROW BEGIN
update meta set value_int=value_int+1 where name='mytable.count';
END;
|
CREATE TRIGGER mytablecountdelete AFTER DELETE ON mytable
FOR EACH ROW BEGIN
update meta set value_int=value_int-1 where name='mytable.count';
END;
|
好吧,使用*
绝对不是最佳选择,但只有 1 列怎么样。我通常使用该id
列来计算行数。