В настоящее время у меня есть база данных с более чем 6 миллионами строк и растет. В настоящее время я делаю SELECT COUNT (id) FROM table; чтобы показать номер моим пользователям, но база данных становится большой, и мне не нужно хранить все эти строки, кроме как показывать номер. Есть ли способ выбрать значение auto_increment для отображения, чтобы я мог очистить большую часть строк в базе данных? Использование LAST_INSERT_ID()
похоже не работает.Самый эффективный способ подсчета строк таблицы
ответ
Если это только о том, чтобы количество записей (строк), я предложил бы использовать:
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) вместо этого.
Это ужасное решение для больших баз данных. Только этот запрос может занять полные минуты, потому что он должен искать всю таблицу 'information_scheme.tables'. Для веб-хостов с тысячами клиентов, работающих с базами данных, эта отдельная таблица становится довольно большой. –
Возможно, вы захотите добавить 'AND table_schema = DATABASE()', поскольку более чем одна база данных может иметь таблицу с тем же именем –
@thinkswan, я уверен, добавив ограничение table_schema, производительность этого запроса скачкообразно перескакивает. –
Рядом с information_schema внушения, это:
SELECT id FROM table ORDER BY id DESC LIMIT 1
также должны быть очень быстро, при условии, что есть индекс на поле идентификатора (который я считаю, должно быть в случае с auto_increment)
Вы также должны добавить LIMIT 1 в конце этого, чтобы он не получал каждый отдельный идентификатор только для этого. –
это не обязательно дает вам последнее значение автоматического инкремента, поскольку вы можете вставлять/обновлять определенные значения в столбце auto_increment –
на самом деле SELECT MAX (id) FROM table следует использовать меньше памяти –
попробовать это
Выполнить этот SQL:
SHOW TABLE STATUS LIKE '<tablename>'
и принеси ю e значение поля Auto_increment
Ниже представлен наиболее результативный способ найти следующее значение 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';
Есть ли какие-либо преимущества по сравнению с решением Джонатана Финнга? – Dan
Не уверен. Я считаю, что это быстрее, потому что вам не нужно выбирать запись, но я не тестировал ее, чтобы подтвердить это. Либо или должен работать для большинства приложений. –
Это работает как реклама (в отличие от ответа LAST_INSERT_ID) и очень быстро. – Timm
Если вы непосредственно получите максимальное число, записав запрос на выбор, тогда может возникнуть вероятность того, что ваш запрос даст неправильное значение. , например. если ваша таблица имеет 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]";
?>
SELECT id FROM table ORDER BY id DESC LIMIT 1
может возвращает максимальный идентификатор не автоматическое приращение идентификатор. оба в разных условиях отличаются друг от друга
Если у вас нет привилегий для «Показать статус», то Лучшим вариантом является создание двух триггеров и новой таблицы, которая хранит количество строк вашей таблицы записей с миллиардами записей.
Пример:
TableA >> миллиардов записей
TableB >> 1 Колонка и 1 Ряд
Всякий раз, когда есть вставка запроса на TableA (InsertTrigger), увеличивает значение строки 1 TableB
Всякий раз есть запрос на удаление на TableA (DeleteTrigger), Уменьшить значение строки на 1 в таблицеB
Не удалось создать запись в отдельной таблице или в любом месте с столбцом «Пользователи» и UPDATE с последним вставленным id o n Регистрация пользователя?
Тогда вы просто проверите это поле с помощью простого запроса.
Это может быть грубо, но это будет работать отлично.
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
$next_id['MAX(id)']; // next auto incr id
надеюсь, что это полезно :)
это не будет работать, если предыдущая последняя запись будет удалена, это вернет максимальный идентификатор строки, который существует, но не следующий, чтобы быть автоматически увеличенным id, – mahen3d
Контроллер
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
}
Я не знаю, почему никто не предложил следующее. Это позволит получить значение auto_increment не используя только SQL (без необходимости использования РНР mysql_fetch_array
):
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
Это, безусловно, лучший ответ, с одним оговоркой. Я предложил изменить, но тем, кто это видит, пока: вы должны включить AND TABLE_SCHEMA = 'database', а также для серверов, содержащих несколько баз данных с тем же именем таблицы. – matt
Ни один из этих ответов не кажется совершенно правы. Я попробовал их всех. Вот мои результаты.
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]);
- 1. Самый эффективный способ подсчета количества строк в каждой группе таблицы
- 2. Самый эффективный способ подсчета кликов
- 3. Самый эффективный способ подсчета случаев?
- 4. Самый эффективный способ визуализации сложных строк таблицы?
- 5. Самый эффективный способ конкат-строк
- 6. Самый эффективный способ строк MySQL?
- 7. Каков эффективный способ подсчета строк в Pig?
- 8. Самый эффективный способ фильтрации таблицы Html?
- 9. Самый эффективный способ удаления всех повторяющихся строк из таблицы?
- 10. MySQL самый быстрый способ подсчета тысяч строк
- 11. PHP Какой самый быстрый способ подсчета строк?
- 12. Самый быстрый способ подсчета строк в файле
- 13. C# Самый эффективный способ подсчета секций в строке, по разделителю
- 14. Самый эффективный способ подсчета пользовательских RSVP по местоположению?
- 15. Самый эффективный способ разбиения многих строк
- 16. Самый эффективный способ печати дерева AVL строк?
- 17. Самый эффективный способ хранения строк в Android
- 18. Самый эффективный способ хранения больших строк base64?
- 19. Самый эффективный способ печати строк в Python?
- 20. эффективный способ подсчета вхождения
- 21. Эффективный способ подсчета столбцов
- 22. Самый эффективный способ разобрать две таблицы?
- 23. Лучший и самый эффективный способ подсчета слов токенов
- 24. Какой самый эффективный способ подсчета узлов xml в Java
- 25. Самый эффективный способ обновления столбца
- 26. Самый короткий способ подсчета?
- 27. Самый быстрый/самый эффективный способ сравнения двух массивов строк Javascript
- 28. Самый эффективный способ подсчета числа 1 с определенного смещения
- 29. ActiveRecord/Rails: самый эффективный способ подсчета результатов нескольких запросов
- 30. Самый эффективный способ подсчета дублированных элементов между двумя массивами
Вы пробовали другие решения, Джеймс? Кажется, они лучше ... – Dan
Если вы никогда не удаляли запись, то auto_increment был бы прав, но в противном случае он отключен количеством записей, удаленных с момента рождения таблицы. – cgTag
Чтобы просто понять разницу, получение количества строк говорит вам, сколько строк есть сейчас. Если вы хотите, чтобы ваш счет включал строки, которые когда-то были там, но затем удалялся, вам нужен auto_increment (хотя это также будет включать строки, которые присутствовали только в транзакции, которая была отброшена, а не была зафиксирована). – octern