Самый эффективный способ получить количество строк таблицы - PullRequest
64 голосов
/ 01 июня 2009

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

Ответы [ 12 ]

88 голосов
/ 05 апреля 2010

Следующее является наиболее эффективным способом найти следующее 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';
59 голосов
/ 01 июня 2009

Если речь идет только о получении количества записей (строк), я бы предложил использовать:

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).

29 голосов
/ 10 июля 2009

попробуйте

Выполнить этот SQL:

SHOW TABLE STATUS LIKE '<tablename>'

и получить значение поля Auto_increment

17 голосов
/ 25 сентября 2013

Я не уверен, почему никто не предложил следующее. Это получит значение auto_increment, используя только SQL (нет необходимости использовать PHP mysql_fetch_array):

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
2 голосов
/ 17 декабря 2010

, если вы напрямую получите максимальное число, написав запрос на выборку, возможно, ваш запрос даст неправильное значение. например если в вашей таблице 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]";
?>
1 голос
/ 03 сентября 2011

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

Пример:

Таблица A >> Миллиард записей
Таблица B >> 1 столбец и 1 строка

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

1 голос
/ 20 августа 2011

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

0 голосов
/ 16 июля 2017

Ни один из этих ответов не кажется правильным. Я перепробовал их все. Вот мои результаты.

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]);
0 голосов
/ 09 мая 2013

Контроллер

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

}
0 голосов
/ 16 октября 2012
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
$next_id['MAX(id)']; // next auto incr id

надеюсь, что это полезно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...