Mysql 获取表行数的最有效方法
我目前有一个超过600万行的数据库,而且还在增长。我目前确实从表中选择了计数(id);为了向我的用户显示数字,但数据库越来越大,我不需要存储所有这些行,只需要能够显示数字。有没有办法选择要显示的自动增量值,以便清除数据库中的大多数行?使用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
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]);