我有一个很大的数据库表。我需要在很短的时间内确切地知道表中包含多少行。用户每次都会在我的网站的每一页上请求行数。这并不是一个罕见的请求。
我有以下方法:
1.这是一个O(n)的时间复杂度问题,所以,如果我的表中有超过100行的行,那么这个时间复杂度是O(n)的。
1.我可以在每次插入项目时增加文本文件中的数字
1.我可以切换到MyISAM,因为它保存行计数,但问题是它在选择速度较慢。在我的应用程序中,我大多选择大量。
- SELECT COUNT(*)FROM表/ SELECT * FROM表ORDER BY标识描述限制1;但是对于非常大的数据库表来说,它们非常慢或混乱。
我应该使用哪种方法,或者有更好的方法吗?
2条答案
按热度按时间6ju8rftf1#
如果你需要完美的精确度,
select count(id) from table
或select count(1) from table
是唯一的方法。如果你能忍受一个近似值,
table_rows
来自information_schema.tables
。我发现这对于UI目的来说已经足够了,比如“显示10393的40个”。有些储存引擎(例如MyISAM)会储存精确的计数。对于其他储存引擎(例如InnoDB),此值是近似值,可能会与实际值相差40%到50%。在这种情况下,请使用SELECT COUNT(*)来取得精确的计数。
最后,你可以缓存
select count(id)
中的值,并定期更新它。我不能说这是否会比information_schema.tables
更准确。你必须做一些测试。缓存可以大大加快count
查询的速度,它也有一个像select count(id) from table where this = 'that'
这样的过滤器。您可能会尝试使用
information_schema.tables
中的auto_increment
值。这只能提供上限。它总是高估行数,因为...id
会将auto_increment值移动到id
+ 1。例如,
insert into select
将执行此操作,插入和回滚也将执行此操作。mv1qrgav2#
如果从未从表中删除行,并且auto_increment PK与auto_increment增量/偏移为1,请执行以下操作:
并从中解析出auto_increment值。每隔一个路将是slow(count()/max())或近似值(
SHOW INDEX FROM table_name;
或from(information_schema.TABLES
))。警告:如果您从表中删除行,或者执行INSERT+ROLLBACK,或者遇到INSERT死锁(将分配auto_increment值,但不添加实际记录),则
SHOW CREATE TABLE
将不准确。