Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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

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

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