Mysql 获取表行数的最有效方法

Mysql 获取表行数的最有效方法,mysql,sql,count,Mysql,Sql,Count,我目前有一个超过600万行的数据库,而且还在增长。我目前确实从表中选择了计数(id);为了向我的用户显示数字,但数据库越来越大,我不需要存储所有这些行,只需要能够显示数字。有没有办法选择要显示的自动增量值,以便清除数据库中的大多数行?使用LAST\u INSERT\u ID() SELECT TABLE_ROWS FROM information_schema.tables WHERE table_name='the_table_you_want' -- Can end here if onl

我目前有一个超过600万行的数据库,而且还在增长。我目前确实从表中选择了计数(id);为了向我的用户显示数字,但数据库越来越大,我不需要存储所有这些行,只需要能够显示数字。有没有办法选择要显示的自动增量值,以便清除数据库中的大多数行?使用
LAST\u INSERT\u ID()

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是这样。)

在信息模式建议旁边,这是:

SELECT id FROM table ORDER BY id DESC LIMIT 1
如果id字段上有索引(我相信自动递增的情况一定是这样的),那么速度也应该非常快。

试试这个

执行以下SQL:

SHOW TABLE STATUS LIKE '<tablename>'
显示表格状态,如“”

并获取字段的值
Auto_increment

以下是查找表的下一个
Auto_increment
值的最有效方法。即使在包含数百万个表的数据库上,这也很快,因为它不需要查询潜在的大型
信息\u模式
数据库

mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column
但是,如果必须在查询中检索此值,则必须转到
信息\u架构
数据库

SELECT `AUTO_INCREMENT`
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_SCHEMA = 'DatabaseName'
AND    TABLE_NAME   = 'TableName';

若您通过编写select查询直接获得get max number,那个么您的查询可能会给出错误的值。 e、 g.如果您的表有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]";
?>


按id描述从表顺序中选择id限制1
可以返回最大id而不是自动增量id。如果您没有“显示状态”的权限,则在某些情况下,这两种id都是不同的, 最好的选择是,创建两个触发器和一个新表,用于保存十亿条记录表的行数

例如:

表A>>十亿条记录
表B>>一列一行

每当对TableA(InsertTrigger)进行insert查询时,将行值增加1 TableB

每当对TableA进行删除查询(DeleteTrigger)时,将TableB中的行值减1

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

然后,您只需通过一个简单的查询检查此字段

它可能很粗糙,但会很完美

$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

}

我不知道为什么没有人提出以下建议。这将仅使用SQL获得自动增量值(无需使用PHP的
mysql\u fetch\u数组
):


这些答案似乎都不完全正确。我都试过了。这是我的结果

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
以下是截图:

以下是我的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]);

您还应该在末尾添加一个限制1,这样它就不会仅为此检索每个id。这不一定会给您最后一个自动增量值,因为您可以在自动增量列中插入/更新特定值。请实际选择最大值(id)表中应该使用更少的内存我认为如果这个答案无效,就应该删除它。这实际上只有在未做任何更改的情况下才有效——也就是说,不删除这对于大型数据库来说是一个糟糕的解决方案。单独完成此查询可能需要整整几分钟的时间,因为它必须搜索整个
信息\u scheme.tables
表。对于有数千个客户端运行数据库的webhosts,单个表会变得相当大。您可能需要添加
和table_schema=DATABASE()
,因为多个数据库可以有一个具有相同数据库的表name@thinkswan,我打赌,通过添加表\u模式限制,该查询的性能会大幅提升。这会返回autoincrement\u id值还是表中的行数?我认为这应该是
从…
选择自动增量@jjmontes是正确的-
表行
自动增量
是不同的统计数据,OP问题是误导性的<代码>表格行
=表格中的行,
自动增量
=自动inc计数器的值。我可以有一个只有一行的表,但是自动增量设置为1000000。(例如,如果从表中删除前999999行,则很容易发生这种情况!)。
AUTO_INCREMENT
值实际上是用户可配置的,因此绝对不要假设行数和AUTO inc是同一件事,这一点非常重要<代码>表_行!==自动增量詹姆斯,你尝试过其他解决方案吗?它们似乎更好…如果您从未删除过记录,那么自动增量将是正确的,但除此之外,它与自表诞生以来删除的记录数无关。为了明确区别,获取行数会告诉您现在有多少行。如果您希望计数包括曾经存在但随后被删除的行,则需要自动增量(尽管这也将包括仅在回滚而不是提交的事务中出现的行)。或者,如果有人硬编码了一个高于当前自动增量的值以进行某些插入,您也可以跳过一些。我要说的是,自动递增不是一种真正值得信赖的计数方式。它的工作原理与宣传的一样(与上次的插入ID答案相反),而且速度非常快。这应该被选为这个问题的正确答案。这种方法的效率要高得多,而且不需要挖掘共享mySQL服务器上可能会带来负担的schema.tables信息@thinkswan是一个伟大而简单的解决方案。这个问题不是在寻找一个MySQL解决方案,而不是一个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]);