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

时间:2009-06-01 04:30:23

标签: mysql sql count

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

12 个答案:

答案 0 :(得分:88)

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

答案 1 :(得分: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

(至少对于MySQL而言)。

答案 2 :(得分:29)

试试这个

执行此SQL:

SHOW TABLE STATUS LIKE '<tablename>'

并获取字段Auto_increment

的值

答案 3 :(得分:17)

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

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

答案 4 :(得分:2)

如果您通过编写选择查询直接获得最大数量,那么您的查询可能会给出错误的值。 例如如果你的表有5条记录,所以你的增量id是6,如果我删除5号记录你的表有4条记录,最大id是4,在这种情况下,你将获得5作为下一个增量id。 你可以从mysql defination本身获取信息。通过在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]";
?>

答案 5 :(得分:1)

SELECT id FROM table ORDER BY id DESC LIMIT 1可以返回最大ID而不是自动增量ID。在某些情况下两者都不同

答案 6 :(得分:1)

如果您没有“显示状态”的权限,那么, 最好的选择是创建两个触发器和一个新表,它保存十亿记录表的行数。

示例:

表A&gt;&gt;亿记录 表B&gt; 1列和1行

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

答案 7 :(得分:0)

在information_schema建议旁边,这个:

SELECT id FROM table ORDER BY id DESC LIMIT 1

也应该非常快,前提是id字段有一个索引(我认为必须是auto_increment的情况)

答案 8 :(得分:0)

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

希望它有用:)

答案 9 :(得分:0)

<强>控制器

SomeNameModel::_getNextID($this->$table)

<强> MODEL

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

}

答案 10 :(得分:0)

这些答案似乎都不对。我尝试了所有这些。这是我的结果。

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

答案 11 :(得分:-1)

难道你不能只在一个单独的表中创建一个记录,或者在一个名为Users的列中创建一个记录,并在用户注册时使用最后插入的id更新它吗?

然后你只需用简单的查询来检查这个字段。

它可能很粗糙,但它可以完美地运作。