В настоящее время у меня есть база данных с более чем 6 миллионами строк, которая продолжает расти. В настоящее время я делаю SELECT COUNT (id) FROM table; чтобы отображать число для моих пользователей, но база данных становится все больше, и мне нет необходимости хранить все эти строки, кроме как для отображения числа. Есть ли способ выбрать значение auto_increment для отображения, чтобы я мог очистить большинство строк в базе данных? Использование LAST_INSERT_ID()
, похоже, не работает.
Самый эффективный способ получить количество строк в таблице
Ответы (12)
Если речь идет только о количестве записей (строк), я бы предложил использовать:
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
таблице. Для веб-хостов с тысячами клиентов, работающих с базами данных, эта единая таблица становится довольно большой.
- person Graham Swan; 05.04.2010
AND table_schema=DATABASE()
, поскольку в нескольких базах данных может быть таблица с одинаковым именем.
- person Alex Jasmin; 23.04.2010
SELECT AUTO_INCREMENT FROM...
.
- person jjmontes; 11.01.2013
TABLE_ROWS
и AUTO_INCREMENT
- разные статистические данные, и вопрос OP вводит в заблуждение. TABLE_ROWS
= строки в таблице, AUTO_INCREMENT
= значение счетчика auto inc. У меня может быть таблица только с одной строкой, но для AUTO_INCREMENT установлено значение 1000000. (Это легко может произойти, если вы удалите, например, первые 999 999 строк из таблицы!). Значение AUTO_INCREMENT
на самом деле настраивается пользователем, поэтому очень важно никогда и никогда не делать предположений, что количество строк и auto inc - это одно и то же. TABLE_ROWS !== AUTO_INCREMENT
- person methai; 05.04.2013
Ниже приведен наиболее эффективный способ найти следующее значение 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
Я не уверен, почему никто не предложил следующее. Это позволит получить значение auto_increment, используя только SQL (нет необходимости использовать PHP mysql_fetch_array
):
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
если вы напрямую получите максимальное число, написав запрос выбора, то есть вероятность, что ваш запрос даст неправильное значение. например если в вашей таблице 5 записей, поэтому ваш идентификатор приращения будет 6, и если я удалю запись № 5, в вашей таблице будет 4 записи с максимальным идентификатором 4, в этом случае вы получите 5 в качестве следующего идентификатора приращения. В связи с этим вы можете получить информацию из самого определения 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
может возвращать максимальный идентификатор, а не идентификатор автоматического увеличения. оба разные в некоторых условиях
Если у вас нет привилегии «Показать статус», то лучший вариант - создать два триггера и новую таблицу, в которой будет храниться количество строк в вашей таблице миллиардов записей.
Пример:
ТаблицаA >> Миллиард записей
ТаблицаB >> 1 столбец и 1 строка
Всякий раз, когда есть запрос вставки в TableA (InsertTrigger), увеличивайте значение строки на 1 TableB
Всякий раз, когда есть запрос на удаление в TableA (DeleteTrigger), уменьшайте значение строки на 1 в TableB
Рядом с предложением information_schema это:
SELECT id FROM table ORDER BY id DESC LIMIT 1
также должен быть очень быстрым, при условии, что в поле id есть индекс (что, как я считаю, должно быть в случае с auto_increment)
id
, будет показан следующий вниз, а не фактический AUTO_INCREMENT
.
- person uınbɐɥs; 19.09.2012
$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]);
Не могли бы вы просто создать запись в отдельной таблице или что-то еще со столбцом под названием «Пользователи» и ОБНОВИТЬ ее с последним вставленным идентификатором при регистрации пользователя?
Тогда вы просто проверите это поле с помощью простого запроса.
Это может быть грубо, но сработает отлично.