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


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

12 63

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

не могли бы вы просто создать запись в отдельной таблице или что-то еще со столбцом под названием пользователи и обновить его с последним вставленным идентификатором при регистрации Пользователя?

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

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