стоит SELECT COUNT (*) дорого? - PullRequest
6 голосов
/ 31 июля 2011

Считаете ли вы хорошей идеей подсчитывать записи из действительно большой таблицы (например, 50К строк) при каждой загрузке страницы?

SELECT COUNT(*) FROM table

Сейчас у меня около 2000 строк, и, кажется, довольно быстро, я не вижу никаких задержек при загрузке страницы:)

Но таблица должна доходить до 50К записей ... И мне интересно, как она будет загружаться тогда

(ps: эта страница, которая показывает количество строк, является частной, в интерфейсе администратора, а не общедоступной)

Ответы [ 7 ]

8 голосов
/ 31 июля 2011

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

mysql> SELECT COUNT(*) FROM student;

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

Источник

Поскольку вы сказали, что используете MyISAM и ваш запрос относится ко всей таблице, не имеет значения, является ли она 1 или 100000 строками.

0 голосов
/ 31 июля 2014

В MyISAM число (*) оптимизируется, когда не выполняется условие «WHERE», поэтому запрос выполняется очень быстро даже с миллиардами строк.

В случае секционированных таблиц мыМожно подумать, что он будет вести себя так же, если в столбце, который определяет раздел, будет простое условие (например: подсчитать все строки в нескольких физических таблицах логической таблицы).Но это не так: он проходит по всем строкам рассматриваемых физических таблиц, даже если мы хотим подсчитать их все.Например, здесь, в таблице из 98 миллионов строк, разделенной на 40 таблиц, для подсчета количества строк в последних 32 физических таблицах требуется более 5 минут.

0 голосов
/ 31 июля 2011

Механизм MyISAM хранит внутреннее количество строк, поэтому при выполнении запроса, подобного SELECT COUNT(*) FROM table, он будет быстрым.С InnoDB, с другой стороны, это займет некоторое время, потому что это подсчитывает фактические строки.Что означает - больше строк - тем медленнее становится.Но есть хитрость, с помощью которой вы используете небольшой индекс покрытия для подсчета всех строк в таблице - тогда это быстро.Другая хитрость заключается в том, чтобы просто сохранить количество строк в соответствующей сводной таблице.

0 голосов
/ 31 июля 2011

count(*) - это O (n), поэтому его производительность связана с количеством записей в таблице, 50k - это совсем немного, поэтому я думаю, что это нормально на странице администратора. Когда вы попадаете в миллионы count(*) определенно становится дорогим.

0 голосов
/ 31 июля 2011

COUNT(*) не дорогая операция, она фактически не возвращает данные, просто смотрит на индексы. У вас должно быть все в порядке даже на столе в 50 тысяч.

Если у вас возникли проблемы с загрузкой, было бы просто убрать и оптимизировать на этом этапе.

0 голосов
/ 31 июля 2011

Может быть.Согласно этому форуму PostgreSql выполнит полное сканирование базы данных, чтобы выяснить количество.

0 голосов
/ 31 июля 2011

Как вы сказали, эта страница pvt и не общедоступна. Я не вижу никаких проблем с этим запросом и 50k записями, они не должны оказывать реального влияния на время загрузки страницы и нагрузку на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...