2009-06-01 3 views
63

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

+3

Вы пробовали другие решения, Джеймс? Кажется, они лучше ... – Dan

+0

Если вы никогда не удаляли запись, то auto_increment был бы прав, но в противном случае он отключен количеством записей, удаленных с момента рождения таблицы. – cgTag

+2

Чтобы просто понять разницу, получение количества строк говорит вам, сколько строк есть сейчас. Если вы хотите, чтобы ваш счет включал строки, которые когда-то были там, но затем удалялся, вам нужен auto_increment (хотя это также будет включать строки, которые присутствовали только в транзакции, которая была отброшена, а не была зафиксирована). – octern

ответ

59

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

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) вместо этого.

+7

Это ужасное решение для больших баз данных. Только этот запрос может занять полные минуты, потому что он должен искать всю таблицу 'information_scheme.tables'. Для веб-хостов с тысячами клиентов, работающих с базами данных, эта отдельная таблица становится довольно большой. –

+13

Возможно, вы захотите добавить 'AND table_schema = DATABASE()', поскольку более чем одна база данных может иметь таблицу с тем же именем –

+0

@thinkswan, я уверен, добавив ограничение table_schema, производительность этого запроса скачкообразно перескакивает. –

0

Рядом с information_schema внушения, это:

SELECT id FROM table ORDER BY id DESC LIMIT 1 

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

+0

Вы также должны добавить LIMIT 1 в конце этого, чтобы он не получал каждый отдельный идентификатор только для этого. –

+5

это не обязательно дает вам последнее значение автоматического инкремента, поскольку вы можете вставлять/обновлять определенные значения в столбце auto_increment –

+7

на самом деле SELECT MAX (id) FROM table следует использовать меньше памяти –

29

попробовать это

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

SHOW TABLE STATUS LIKE '<tablename>' 

и принеси ю e значение поля Auto_increment

87

Ниже представлен наиболее результативный способ найти следующее значение 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'; 
+0

Есть ли какие-либо преимущества по сравнению с решением Джонатана Финнга? – Dan

+0

Не уверен. Я считаю, что это быстрее, потому что вам не нужно выбирать запись, но я не тестировал ее, чтобы подтвердить это. Либо или должен работать для большинства приложений. –

+2

Это работает как реклама (в отличие от ответа LAST_INSERT_ID) и очень быстро. – Timm

2

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

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

1

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

Пример:

TableA >> миллиардов записей
TableB >> 1 Колонка и 1 Ряд

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

-1

Не удалось создать запись в отдельной таблице или в любом месте с столбцом «Пользователи» и UPDATE с последним вставленным id o n Регистрация пользователя?

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

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

0
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table")); 
$next_id['MAX(id)']; // next auto incr id 

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

+0

это не будет работать, если предыдущая последняя запись будет удалена, это вернет максимальный идентификатор строки, который существует, но не следующий, чтобы быть автоматически увеличенным id, – mahen3d

0

Контроллер

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 

} 
16

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

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table' 
+2

Это, безусловно, лучший ответ, с одним оговоркой. Я предложил изменить, но тем, кто это видит, пока: вы должны включить AND TABLE_SCHEMA = 'database', а также для серверов, содержащих несколько баз данных с тем же именем таблицы. – matt

0

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

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]); 
Смежные вопросы