mysql - MySQL innoDB 获得有效的行数
问题描述
我有一个大型数据库表。我需要在很短的时间内准确地知道表格包含多少行。用户每次都会在我网站的每个页面上请求该号码。这不是一个罕见的要求。
我有以下方法:
- 使用主键,所以通过使用 MAX(id) 我已经有了行数。但它是 O(n)。在我的桌子上 > 1mio 行它很慢。
- 每次插入项目时,我都可以在文本文件中增加一个数字
- 我可以切换到 MyISAM,因为它保存了行计数,但问题是它的选择速度较慢。在我的应用程序中,我主要选择大量。
- SELECT COUNT(*) FROM table / SELECT * FROM table ORDER BY id DESC LIMIT 1; 但是对于非常大的数据库表,它们非常缓慢或混乱。
我应该使用哪种方法,或者有更好的方法?
解决方案
如果您需要完美的准确性,select count(id) from table
或者select count(1) from table
是唯一的方法。我建议不要切换到 MyISAM。
如果你能接受一个近似值,table_rows
从information_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_increment
from 的值information_schema.tables
。这只能为您提供一个上限。它总是会高估行数,因为...
- 行被删除。
- auto_increment 值可以在不插入任何内容的情况下前进。
- 手动插入 an
id
会将 auto_increment 值移动到id
+ 1。
例如,insert into select
将这样做,插入和回滚也是如此。
推荐阅读
- jhipster - 如何使用 Ionic 连接到 JHipster 应用程序?
- python - 在 tensorflow 2.0 中获取变量范围
- javascript - 在 .bind 和 .apply 中覆盖 `this`
- php - wordpress 帖子中的分页
- bash - GIT批量删除具有特定文件名的整个项目
- sql - SQL - 如果表中存在值,如何返回布尔值
- python - 用 Z3 中的表达式替换函数
- python - 抓取时我无法访问完整的 html 正文
- android - Android:如何将我搜索过的每个项目添加到 RecyclerView?(TextChangeListener 和房间数据库)
- python - 如何在 pyenv virtualenv 中默认更新 pip