Самый эффективный способ получить количество строк таблицы
в настоящее время у меня есть база данных с более чем 6 миллионов строк и растет. В настоящее время я выбираю COUNT(id) из таблицы; чтобы отобразить число для моих пользователей, но база данных становится большой, и мне не нужно хранить все эти строки, кроме как для отображения числа. Есть ли способ выбрать значение 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) вместо.
Ниже приведен наиболее эффективный способ найти следующий
AUTO_INCREMENT
значение для таблицы. Это быстро даже на базах данных, содержащих миллионы таблиц, потому что это не требует запроса потенциально большой
попробуй такое
выполните этот 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'
Если вы непосредственно получаете получить максимальное число, написав select query, то может возникнуть вероятность, что ваш запрос даст неправильное значение. например, если ваша таблица имеет 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
может возвращает максимальный ID не ID автоматически инкрементировать. оба отличаются в некоторых условиях
Если у вас нет привилегии для "показать статус", то, Лучший вариант-создать два триггера и новую таблицу, в которой хранится количество строк вашей таблицы billion records.
пример:
Таблица > > Миллиард Записей
TableB > > 1 столбец и 1 строкавсякий раз, когда есть запрос insert на TableA(InsertTrigger), увеличьте значение строки на 1 TableB
Всякий раз, когда есть запрос на удаление таблицы (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]);
не могли бы вы просто создать запись в отдельной таблице или что-то еще со столбцом под названием пользователи и обновить его с последним вставленным идентификатором при регистрации Пользователя?
тогда вы просто проверите это поле с помощью простого запроса.
Это может быть грубо, но это будет работать отлично.