首页 > 解决方案 > MySQL innoDB 获得有效的行数

问题描述

我有一个大型数据库表。我需要在很短的时间内准确地知道表格包含多少行。用户每次都会在我网站的每个页面上请求该号码。这不是一个罕见的要求。

我有以下方法:

  1. 使用主键,所以通过使用 MAX(id) 我已经有了行数。但它是 O(n)。在我的桌子上 > 1mio 行它很慢。
  2. 每次插入项目时,我都可以在文本文件中增加一个数字
  3. 我可以切换到 MyISAM,因为它保存了行计数,但问题是它的选择速度较慢。在我的应用程序中,我主要选择大量。
  4. SELECT COUNT(*) FROM table / SELECT * FROM table ORDER BY id DESC LIMIT 1; 但是对于非常大的数据库表,它们非常缓慢或混乱。

我应该使用哪种方法,或者有更好的方法?

标签: mysql

解决方案


如果您需要完美的准确性,select count(id) from table或者select count(1) from table是唯一的方法。我建议不要切换到 MyISAM。

如果你能接受一个近似值,table_rowsinformation_schema.tables. 我发现这足以满足 UI 目的,例如“显示 40 of 10393”。

一些存储引擎,例如 MyISAM,存储确切的计数。对于其他存储引擎,例如 InnoDB,这个值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的计数。

select table_rows
from information_schema.tables
where tables.table_schema = 'your database name'
  and tables.table_type = 'your table';

最后,您可以缓存其中的值select count(id)并定期更新它。这是否会比information_schema.tables我不能说的更准确。你必须做一些测试。缓存可以大大加快count查询的速度,这些查询也有类似select count(id) from table where this = 'that'.


您可能很想使用auto_incrementfrom 的值information_schema.tables。这只能为您提供一个上限。它总是会高估行数,因为...

  • 行被删除。
  • auto_increment 值可以在不插入任何内容的情况下前进。
  • 手动插入 anid会将 auto_increment 值移动到id+ 1。

例如,insert into select将这样做,插入和回滚也是如此。


推荐阅读