获得表行计数的最有效方法

Jam*_*son 65 mysql sql count

我目前有一个超过600万行的数据库,并且还在增长.我目前做SELECT COUNT(id)FROM table; 为了向我的用户显示该号码,但数据库变得越来越大,除了能够显示该号码之外,我不需要存储所有这些行.有没有办法选择要显示的auto_increment值,以便我可以清除数据库中的大多数行?使用LAST_INSERT_ID()似乎不起作用.

Gra*_*wan 88

以下是查找AUTO_INCREMENT表的下一个值的最高性能方法.即使在容纳数百万个表的数据库上,这也很快,因为它不需要查询可能很大的information_schema数据库.

mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column
Run Code Online (Sandbox Code Playgroud)

但是,如果必须在查询中检索此值,则information_schema必须转到数据库.

SELECT `AUTO_INCREMENT`
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_SCHEMA = 'DatabaseName'
AND    TABLE_NAME   = 'TableName';
Run Code Online (Sandbox Code Playgroud)

  • 这个问题不是寻找MySQL解决方案而不是PHP解决方案吗? (6认同)
  • 为什么你觉得有必要用PHP代码来解决问题?问题是关于SQL. (5认同)
  • 应该选择此项作为此问题的正确答案.这种方法效率更高,不需要挖掘可能对共享mySQL服务器造成负担的information_schema.tables.@thinkswan伟大而简单的解决方案. (3认同)
  • 这与广告一样(与LAST_INSERT_ID答案相反)并且非常快. (2认同)

Jam*_*ore 59

如果它只是关于获取我建议使用的记录(行)数量:

SELECT TABLE_ROWS
FROM information_schema.tables 
WHERE table_name='the_table_you_want' -- Can end here if only 1 DB 
  AND table_schema = DATABASE();      -- See comment below if > 1 DB
Run Code Online (Sandbox Code Playgroud)

(至少对于MySQL而言).

  • 你可能想添加`AND table_schema = DATABASE()`,因为多个数据库可以有一个同名的表 (13认同)
  • 这是否返回autoincrement_id值或表中的行数?我认为这应该是`SELECT AUTO_INCREMENT FROM ...`. (8认同)
  • @jjmontes是正确的 - "TABLE_ROWS"和"AUTO_INCREMENT"是不同的统计数据,OP问题具有误导性.`TABLE_ROWS` =表中的行,`AUTO_INCREMENT` = auto inc counter的值.我可以有一个只有一行的表,但AUTO_INCREMENT设置为1,000,000.(如果从表中删除第一个999,999行,则很容易发生这种情况!).`AUTO_INCREMENT`值实际上是用户可配置的,因此永远不要假设行计数和自动转换是相同的事情是非常重要的.`TABLE_ROWS!== AUTO_INCREMENT` (8认同)
  • 这对大型数据库来说是一个糟糕的解决方案.仅此查询可能需要整整几分钟才能完成,因为它必须搜索整个`information_scheme.tables`表.对于拥有数千个运行数据库的客户端的webhost,该单个表变得非常大. (7认同)

小智 29

试试这个

执行这个SQL:

SHOW TABLE STATUS LIKE '<tablename>'
Run Code Online (Sandbox Code Playgroud)

并获取字段的值 Auto_increment


doi*_*tin 17

我不确定为什么没有人提出以下建议.这将使用SQL获取auto_increment值(不需要使用PHP mysql_fetch_array):

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最好的答案,有一点需要注意.我建议进行编辑,但对于那些在此期间看到这一点的人:对于包含多个具有相同表名的数据库的服务器,您应该包括AND TABLE_SCHEMA ='database'. (2认同)