Лучший способ подсчета строк из базы данных MySQL - PullRequest
3 голосов
/ 04 августа 2011

Столкнувшись с проблемой медленной загрузки с запросом MySQL, я сейчас ищу лучший способ подсчета количества строк.Я тупо использовал mysql_num_rows() функцию, чтобы сделать это, и теперь понял, что это худший способ сделать это.Я на самом деле делал пагинацию для создания страниц на PHP.Я нашел несколько способов подсчета количества строк.Но я ищу более быстрый способ его подсчета.

Тип таблицы MyISAM

Итак, вопрос сейчас

Какой счет лучше и быстрее -

1. `SELECT count(*) FROM 'table_name'`

2. `SELECT TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema =  'database_name'
AND table_name LIKE  'table_name'`

3. `SHOW TABLE STATUS LIKE 'table_name'`

4. `SELECT FOUND_ROWS()`

Если есть другие способы сделать это лучше, пожалуйста, дайте мне знать их.Если возможно, пожалуйста, опишите вместе с ответом - почему это лучше и быстрее.Так что я мог понять и использовать метод, основанный на моих требованиях.

Спасибо.

Ответы [ 5 ]

7 голосов
/ 04 августа 2011

Цитирование справочного руководства MySQL по COUNT

COUNT (*) оптимизировано для очень быстрого возврата, если SELECT извлекает из одной таблицы, другие столбцы не извлекаются, инет пункта ГДЕ.Например:

mysql> SELECT COUNT(*) FROM student; 

Эта оптимизация применяется только к таблицам MyISAM, поскольку для этого механизма хранения хранится точное количество строк, к которому можно получить очень быстрый доступ.Для механизмов хранения транзакций, таких как InnoDB, сохранение точного количества строк более проблематично, поскольку может происходить несколько транзакций, каждая из которых может влиять на количество.

Также прочитайте этот вопрос MySQL - сложностьиз: ВЫБРАТЬ СЧЕТ (*) ИЗ MyTable;

5 голосов
/ 04 августа 2011

Я бы начал с использования SELECT count(*) FROM 'table_name', потому что он является наиболее переносимым и легким для понимания, а также потому, что вполне вероятно, что разработчики СУБД оптимизируют распространенные идиоматические запросы такого рода.

Только если бы этого было недостаточно, я бы сравнил список подходов, которые вы перечислили, чтобы найти, были ли они значительно быстрее.

2 голосов
/ 04 августа 2011

Немного быстрее посчитать константу:

select count('x') from table;

Когда парсер нажимает count(*), он должен выяснить, какие все столбцы таблицы представлены *будьте готовы принять их внутри count().

Использование константы позволяет обойти эту (хотя и небольшую) проверку столбца.

Кстати, хотя и не быстрее, есть один милый вариант:

select sum(1) from table;
1 голос
/ 05 марта 2016

Я недавно немного осмотрелся по этому поводу. Кажется, здесь есть несколько таких, кого я никогда раньше не видел.

Особые потребности: в этой базе данных содержится около 6 миллионов записей, и она все время ломается от запросов с несколькими вставками. Получить истинный счет трудно, если не сказать больше.

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE table_schema =  'admin_worldDomination' AND table_name LIKE  'master'

Showing rows 0 - 0 ( 1 total, Query took 0.0189 sec)

Это прилично, очень быстро, но неточно. Показано результатов от 4 миллионов до почти 8 миллионов строк

SELECT count( * ) AS counter FROM `master`

Время не отображается, в режиме реального времени - 8 секунд. Становится намного хуже по мере роста стола. Это убивало мой сайт до сегодняшнего дня.

SHOW TABLE STATUS LIKE 'master'

Кажется, что это так же быстро, как первый, хотя время не отображается. Предлагает много другой табличной информации, но не очень много чего стоит (может быть длина записи в среднем).

SELECT FOUND_ROWS() FROM 'master'

Showing rows 0 - 29 ( 4,824,232 total, Query took 0.0004 sec)

Это хорошо, но в среднем. Распространение меньше, чем у других (4-5 миллионов), поэтому я, вероятно, в конечном итоге выберу выборку из нескольких этих запросов и усредню.

РЕДАКТИРОВАТЬ: Это было очень медленно при выполнении запроса в php, в конечном итоге, с первым. Запрос выполняется в 30 раз быстрее, и я беру в среднем менее 1 секунды ... он по-прежнему колеблется между 5,3 и 5,5 млн.

0 голосов
/ 04 августа 2011

Одна из идей, которые у меня возникли, - это попытаться найти способ оценить количество строк. Так как это просто для того, чтобы дать вашему пользователю представление о количестве страниц, может быть, вам не нужно быть точным и даже сказать: Страница 1 из ~ 4837 или Страница 1 из примерно 4800 или что-то.

Я не смог быстро найти функцию подсчета оценок, но вы могли бы попытаться получить размер таблицы и разделить ее на определенный / постоянный средний размер строки. Я не знаю, если или почему получение размера таблицы из TABLE STATUS будет быстрее, чем получение строк из TABLE STATUS.

...