Лучший способ подсчета строк из базы данных mysql

Столкнувшись с проблемой медленной загрузки с запросом mysql, я теперь ищу лучший способ подсчета номеров строк. Я тупо использовал функцию mysql_num_rows() для этого и теперь понял, что это худший способ сделать это. На самом деле я делал Pagination для создания страниц в 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()`

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

Спасибо.


person Aajahid    schedule 04.08.2011    source источник
comment
Вы только что попробовали использовать лимит? и соответственно разбивать на страницы во время выполнения? и так далее...   -  person PhD    schedule 04.08.2011
comment
Я на самом деле пытаюсь сделать регулярную разбивку на страницы. Где это будет показано, как Показ страницы 1 из 4739. Я обязательно буду использовать LIMIT для отображения результата, но мне нужно знать количество строк, чтобы сделать точные номера страниц и отобразить их.   -  person Aajahid    schedule 04.08.2011
comment
Можете ли вы опубликовать время для каждого из этих четырех вариантов?   -  person jmilloy    schedule 04.08.2011


Ответы (5)


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

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

mysql> SELECT COUNT(*) FROM student; 

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

Также прочитайте этот вопрос MySQL - Сложность: SELECT COUNT (*) FROM MyTable; < /а>

person Ranhiru Jude Cooray    schedule 04.08.2011

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

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

person RedGrittyBrick    schedule 04.08.2011

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

select count('x') from table;

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

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

В стороне, хотя и не быстрее, один симпатичный вариант:

select sum(1) from table;
person Bohemian♦    schedule 04.08.2011

Недавно я немного огляделся для этого. кажется, здесь есть несколько человек, которых я никогда раньше не видел.

Особые потребности: эта база данных содержит около 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 миллионами.

person Josh Storz    schedule 05.03.2016

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

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

person jmilloy    schedule 04.08.2011