什么是在mysql 4.0中获取innodb表行数的最快方法?

时间:2009-07-28 00:56:34

标签: mysql innodb

MySQL 4.0没有information_schema,“显示来自 db 的表状态”仅提供了innodb表的近似行数。

那么获取innodb表计数的最快方法当然是除了count(*)之外,对于大表来说这可能会更慢。

4 个答案:

答案 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列来计算行数。