В настоящее время у меня есть база данных с более чем 6 миллионами строк и растущая. В настоящее время я делаю SELECT COUNT (id) FROM table; чтобы показать номер моим пользователям, но база данных становится большой, и мне не нужно хранить все эти строки, кроме как показывать номер. Есть ли способ выбрать значение auto_increment для отображения, чтобы я мог очистить большую часть строк в базе данных? Использование LAST_INSERT_ID()
не работает.
Самый эффективный способ подсчета числа строк таблицы
Ответ 1
Если это касается только количества записей (строк), которые я предлагаю использовать:
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
Ниже приведен наиболее эффективный способ найти следующее значение 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';
Ответ 3
попробуйте это
Выполнить этот SQL:
SHOW TABLE STATUS LIKE '<tablename>'
и выберите значение поля Auto_increment
Ответ 4
Я не уверен, почему никто не предложил следующее. Это получит значение auto_increment, используя только SQL (не нужно использовать PHP mysql_fetch_array
):
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
Ответ 5
если вы сразу получите максимальное число, набрав запрос select, тогда может возникнуть вероятность того, что ваш запрос даст неправильное значение. например если ваша таблица имеет 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]";
?>
Ответ 6
SELECT id FROM table ORDER BY id DESC LIMIT 1
может возвращать max id, а не auto increment id. оба в разных условиях различны.
Ответ 7
Если у вас нет привилегий для "Показать статус", Лучший вариант - создать два триггера и новую таблицу, которая будет содержать количество строк вашей миллиардной таблицы записей.
Пример:
TableA → Billion Records
TableB → 1 столбец и 1 строка
Всякий раз, когда в TableA (InsertTrigger) вставлен запрос, добавьте значение строки на 1 TableB
Всякий раз, когда есть запрос на удаление в таблице A (DeleteTrigger), уменьшите значение строки на 1 в TableB
Ответ 8
Рядом с предложением information_schema:
SELECT id FROM table ORDER BY id DESC LIMIT 1
также должен быть очень быстрым, если есть индекс в поле id (который, я считаю, должен иметь место с auto_increment)
Ответ 9
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
$next_id['MAX(id)']; // next auto incr id
надеюсь, что это полезно:)
Ответ 10
контроллер
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
}
Ответ 11
Ни один из этих ответов не кажется правильным. Я попробовал их всех. Вот мои результаты.
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]);
Ответ 12
Не могли бы вы просто создать запись в отдельной таблице или что угодно с столбцом "Пользователи" и ОБНОВИТЬ ее последним вставленным идентификатором "Регистрация пользователя"?
Затем вы просто проверите это поле с помощью простого запроса.
Это может быть грубо, но это будет работать отлично.