MySQL 4.0没有information_schema,“显示来自 db 的表状态”仅提供了innodb表的近似行数。
那么获取innodb表计数的最快方法当然是除了count(*)之外,对于大表来说这可能会更慢。
答案 0 :(得分:4)
<强>更新强>
使用InnoDB时,整个表中仅行的准确计数为COUNT(*)。由于您从4.0升级到5.0只会发生一次,因此您只需要处理速度。
答案 1 :(得分:1)
这适用于所有版本的MySQL。正如其他评论者指出的那样 - InnoDB中没有快速的SELECT COUNT(*)。部分原因是InnoDB是多方面的,它将取决于您的事务的上下文在表中应该有多少行。
有一些解决方法:
1)如果你从不删除,SELECT MAX(id)应该返回正确的行数。
2)您可以将它们归档到“已删除的行表”,而不是删除行(很多人似乎都希望保留所有内容)。假设删除是静止当前的小得多的子集,您可以从not_deleted中减去SELECT max(id)中deleted_rows的count(*)。
3)使用触发器。这很糟糕。
这里有关于这个问题的技术讨论: http://mysqlha.blogspot.com/2009/08/fast-count-for-innodb.html
答案 2 :(得分:1)
等待!有一个快速的方法!使用触发器和元表..
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;
|
答案 3 :(得分:-2)
好吧,使用*
绝对不是最佳选择,但只有1列。我通常使用id
列来计算行数。