我目前拥有一个超过600万行且不断增长的数据库。我目前使用 SELECT COUNT(id) FROM table;
来显示数字给我的用户,但是由于数据库变得越来越大,我没有必要存储所有这些行,除了能够显示数量之外。有没有一种方法可以选择自动增量值来显示,以便我可以清除数据库中的大多数行?使用 LAST_INSERT_ID()
似乎不起作用。
我目前拥有一个超过600万行且不断增长的数据库。我目前使用 SELECT COUNT(id) FROM table;
来显示数字给我的用户,但是由于数据库变得越来越大,我没有必要存储所有这些行,除了能够显示数量之外。有没有一种方法可以选择自动增量值来显示,以便我可以清除数据库中的大多数行?使用 LAST_INSERT_ID()
似乎不起作用。
以下是查找表的下一个AUTO_INCREMENT
值的最高效方法。即使在包含数百万个表的数据库上,这也非常快速,因为它不需要查询可能很大的information_schema
数据库。
mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column
然而,如果你必须在查询中检索此值,则必须前往information_schema
数据库。
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND TABLE_NAME = 'TableName';
如果只是想获取记录(行)的数量,我建议使用:
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
(至少对于MySQL)改用它。
information_scheme.tables
表,因此仅这一个查询可能需要数分钟才能完成。对于拥有数千个客户运行数据库的网络主机而言,该单个表变得非常庞大。 - Graham SwanAND table_schema=DATABASE()
,因为多个数据库可以拥有相同名称的表。 - Alex JasminSELECT AUTO_INCREMENT FROM...
。 - jjmontesTABLE_ROWS
和 AUTO_INCREMENT
是不同的统计数据,而且 OP 的问题是误导性的。TABLE_ROWS
是指表中的行数,AUTO_INCREMENT
是自动增量计数器的值。我可以有一个只有一行的表,但 AUTO_INCREMENT
设置为 1,000,000。(如果您从表中删除了前 999,999 行,这很容易发生!)AUTO_INCREMENT
值实际上是用户可配置的,因此永远不要假设行数和自动增量是相同的东西。 TABLE_ROWS !== AUTO_INCREMENT
- methai试试这个
执行这个SQL语句:
SHOW TABLE STATUS LIKE '<tablename>'
并获取字段Auto_increment
的值
我不确定为什么没有人提出以下建议。这将只使用SQL(无需使用PHP的mysql_fetch_array
)获取自动增量值:
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
如果您直接通过编写select查询来获取最大数字,那么您的查询可能会给出错误的值。 例如,如果您的表有5条记录,则您的增量ID将为6,如果我删除第5条记录,则您的表将具有4条记录,最大ID为4,在这种情况下,您将获得5作为下一个增量ID。 相反,您可以从mysql定义中获取信息。通过在php中编写以下代码:
<?
$tablename = "tablename";
$next_increment = 0;
$qShowStatus = "SHOW TABLE STATUS LIKE '$tablename'";
$qShowStatusResult = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );
$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];
echo "next increment number: [$next_increment]";
?>
SELECT id FROM table ORDER BY id DESC LIMIT 1
可以返回最大的id而不是自动递增的id。在某些情况下,两者是不同的。
除了information_schema建议之外,这个:
SELECT id FROM table ORDER BY id DESC LIMIT 1
如果在id字段上有索引(我相信使用auto_increment必须是这种情况),那么应该也会非常快。
这些答案似乎都不完全正确。我尝试了它们所有。这是我的结果。
Sending query: SELECT count(*) FROM daximation
91
Sending query: SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'
96
Sending query: SHOW TABLE STATUS LIKE 'daximation'
98
Sending query: SELECT id FROM daximation ORDER BY id DESC LIMIT 1
97
这是截图: https://www.screencast.com/t/s8c3trYU
以下是我的PHP代码:
$query = "SELECT count(*) FROM daximation";
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);
$query = "SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'";
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);
$query = "SHOW TABLE STATUS LIKE 'daximation'";
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[10]);
$query = "SELECT id FROM daximation ORDER BY id DESC LIMIT 1";
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);
控制器
SomeNameModel::_getNextID($this->$table)
模型
class SomeNameModel extends CI_Model{
private static $db;
function __construct(){
parent::__construct();
self::$db-> &get_instance()->db;
}
function _getNextID($table){
return self::$db->query("SHOW TABLE STATUS LIKE '".$table."' ")->row()->Auto_increment;
}
... other stuff code
}