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

我目前拥有超过600万行的数据库,并在不断增长。 我目前做SELECT COUNT(id)FROM表; 为了向我的用户显示数字,但数据库变大,我不需要存储所有这些行,除了能够显示数字。 有没有办法selectauto_increment值显示,以便我可以清除数据库中的大部分行? 使用LAST_INSERT_ID()似乎不工作。

如果它只是获取logging(行)我build议使用的数量:

 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 

(至less对于MySQL)。

以下是查找表格的下一个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'; 

尝试这个

执行这个SQL:

 SHOW TABLE STATUS LIKE '<tablename>' 

并获取Auto_increment字段的值

我不知道为什么没有人提出以下build议。 这将使用SQL(不需要使用PHP的mysql_fetch_array )获得auto_increment值:

 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table' 

如果您直接通过编写select查询来获取最大数量,那么您的查询可能会给出错误的值。 例如,如果你的表有5个logging,所以你的增量id将是6,如果我删除了5号logging,你的表有4个logging,最大id是4,在这种情况下你会得到5作为下一个增量id。 insted到,你可以从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。 在一些条件下都是不同的

如果您没有“显示状态”的权限,那么最好的办法是创build两个触发器和一个新的表格,这个表格保留了您的亿logging表的行数。

例:

表A >>十亿个logging
表B >> 1列和1行

每当在TableA(InsertTrigger)上插入查询时,将行值增加1 TableB
每当TableA(DeleteTrigger)上有删除查询时,TableB中的行值减1

在information_schemabuild议旁边,这是:

 SELECT id FROM table ORDER BY id DESC LIMIT 1 

也应该是非常快的,只要在id字段上有一个索引(我相信auto_increment就是这种情况)

 $next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table")); $next_id['MAX(id)']; // next auto incr id 

希望它有帮助:)

调节器

 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 } 

这些答案似乎都不是很正确。 我试了一下。 这是我的结果。

 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]); 

难道你不能只在一个单独的表中创build一个logging,或者用一个名为Users的列来创build一个logging,并用用户注册中的最后一个插入的ID来更新它?

那么你只需用一个简单的查询来检查这个字段。

这可能是粗糙的,但它会完美的工作。