MySQL innoDB高效获取行数

jv4diomz  于 2022-12-03  发布在  Mysql
关注(0)|答案(2)|浏览(301)

我有一个很大的数据库表。我需要在很短的时间内确切地知道表中包含多少行。用户每次都会在我的网站的每一页上请求行数。这并不是一个罕见的请求。
我有以下方法:
1.这是一个O(n)的时间复杂度问题,所以,如果我的表中有超过100行的行,那么这个时间复杂度是O(n)的。
1.我可以在每次插入项目时增加文本文件中的数字
1.我可以切换到MyISAM,因为它保存行计数,但问题是它在选择速度较慢。在我的应用程序中,我大多选择大量。

  1. SELECT COUNT(*)FROM表/ SELECT * FROM表ORDER BY标识描述限制1;但是对于非常大的数据库表来说,它们非常慢或混乱。
    我应该使用哪种方法,或者有更好的方法吗?
6ju8rftf

6ju8rftf1#

如果你需要完美的精确度,select count(id) from tableselect count(1) from table是唯一的方法。
如果你能忍受一个近似值,table_rows来自information_schema.tables。我发现这对于UI目的来说已经足够了,比如“显示10393的40个”。
有些储存引擎(例如MyISAM)会储存精确的计数。对于其他储存引擎(例如InnoDB),此值是近似值,可能会与实际值相差40%到50%。在这种情况下,请使用SELECT COUNT(*)来取得精确的计数。

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

最后,你可以缓存select count(id)中的值,并定期更新它。我不能说这是否会比information_schema.tables更准确。你必须做一些测试。缓存可以大大加快count查询的速度,它也有一个像select count(id) from table where this = 'that'这样的过滤器。
您可能会尝试使用information_schema.tables中的auto_increment值。这只能提供上限。它总是高估行数,因为...

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

例如,insert into select将执行此操作,插入和回滚也将执行此操作。

mv1qrgav

mv1qrgav2#

如果从未从表中删除行,并且auto_increment PK与auto_increment增量/偏移为1,请执行以下操作:

SHOW CREATE TABLE table_name;

并从中解析出auto_increment值。每隔一个路将是slow(count()/max())或近似值(SHOW INDEX FROM table_name;或from(information_schema.TABLES))。
警告:如果您从表中删除行,或者执行INSERT+ROLLBACK,或者遇到INSERT死锁(将分配auto_increment值,但不添加实际记录),则SHOW CREATE TABLE将不准确。

相关问题