3

MySQL 4.0 没有 information_schema 和 'show table status from db ' 只给出了 innodb 表的近似行数。

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

4

4 回答 4

4

更新

使用 InnoDB 时,整个表中唯一准确的行数是 COUNT(*)。由于您从 4.0 升级到 5.0 只会发生一次,因此您只需要处理速度问题。

于 2009-07-28T01:02:10.117 回答
1

这适用于所有版本的 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

于 2009-08-29T04:26:53.913 回答
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;
|
于 2011-02-15T21:44:34.063 回答
-2

好吧,使用*绝对不是最佳选择,但只有 1 列怎么样。我通常使用该id列来计算行数。

于 2009-07-28T01:02:16.687 回答