Самый эффективный способ подсчета числа строк таблицы

В настоящее время у меня есть база данных с более чем 6 миллионами строк и растущая. В настоящее время я делаю SELECT COUNT (id) FROM table; чтобы показать номер моим пользователям, но база данных становится большой, и мне не нужно хранить все эти строки, кроме как показывать номер. Есть ли способ выбрать значение auto_increment для отображения, чтобы я мог очистить большую часть строк в базе данных? Использование LAST_INSERT_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).

Ниже приведен наиболее эффективный способ найти следующее значение 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 записей, поэтому ваш инкремент 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]"; ?> 

SELECT id FROM table ORDER BY id DESC LIMIT 1 может возвращать max id, а не auto increment id. оба в разных условиях отличаются друг от друга

Если у вас нет привилегии «Показывать статус», тогда лучше всего создать два триггера и новую таблицу, которая будет содержать количество строк вашей таблицы с миллиардами записей.

Пример:

Таблица A >> Billion Records
TableB >> 1 колонка и 1 строка

Всякий раз, когда в таблице A (InsertTrigger) есть запрос на вставку, добавьте значение строки на 1 TableB
Всякий раз, когда есть запрос на удаление на TableA (DeleteTrigger), уменьшите значение строки на 1 в TableB

Рядом с предложением information_schema:

 SELECT id FROM table ORDER BY id DESC LIMIT 1 

также должен быть очень быстрым, если есть индекс в поле id (который, я считаю, должен иметь место с auto_increment)

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

Не могли бы вы просто создать запись в отдельной таблице или что угодно с столбцом «Пользователи» и ОБНОВИТЬ ее последним вставленным идентификатором «Регистрация пользователя»?

Тогда вы просто проверите это поле с помощью простого запроса.

Это может быть грубо, но все будет отлично.