Наиболее производительная альтернатива SELECT COUNT (*) с использованием PDO и MySQL - PullRequest
1 голос
/ 07 сентября 2010

Я читал ранее, что SELECT COUNT(*) не работает в MySQL и его следует регулярно избегать.(Как дополнительный вопрос, это только случай для большого количества строк?)

Я использую PHP Data Objects (PDO) для доступа к MySQL.

Как мне считать строкис учетом производительности?

Ответы [ 3 ]

8 голосов
/ 07 сентября 2010

Если вы используете таблицы MyISAM, производительность не ухудшается .MySQL кэширует количество строк в таблицах MyISAM.Вот почему он может мгновенно ответить COUNT (*).В этом случае MySQL просто прочитал бы число строк в таблице из сохраненного значения.

[EDIT]: из блога производительности MySQL:

Для InnoDB: Если выиметь запрос, подобный SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5, этот запрос будет выполнен одинаково как для таблиц MyISAM, так и для таблиц Innodb при выполнении сканирования индекса ярости.Это может быть быстрее или медленнее как для MyISAM, так и для Innodb в зависимости от различных условий.

В реальных приложениях гораздо больше запросов второго типа, чем первого, поэтому обычно это не такая плохая проблема, как может показаться.Как правило, подсчет количества строк необходим инструментам администратора, которые могут отображать его в статистике таблицы, он также может использоваться в статистике приложения, чтобы показать что-то вроде «У нас 123,345 пользователей, которые загрузили 1,334,656 изображений», но их обычно легко удалить.,

Итак, помните, что Innodb работает медленно для запросов ALL COUNT (), но только для очень специфического случая запроса COUNT () без предложения WHERE.

Также интересно читать для вас:

2 голосов
/ 07 сентября 2010

COUNT(*), насколько я знаю, на самом деле более эффективно, чем использование COUNT(columnname).Если вы ищете количество строк, это будет гораздо эффективнее, чем пытаться подсчитывать строки с помощью PDO или MySQL (что, скорее всего, потребует извлечения всех строк, учитывая, что вы не просто выполняете select с count()).

Я не уверен ни в каком другом способе получить счет, но это должно быть просто отлично, в зависимости от того, что вы делаете.Главное, на чем вы должны сконцентрироваться, это убедиться, что ваши таблицы правильно настроены на indexes, так как это значительно увеличит скорость MySQL и т. Д., Если все сделано правильно.

1 голос
/ 07 сентября 2010

PDO на самом деле не имеет отношения к выполнению конкретного запроса подсчета. PDO - это то, как вы подключаетесь к MySQL. Вы не должны использовать count (colname), если вам просто нужно количество строк, вы должны использовать count (*). Если вы укажете colname и этот столбец не указан как NOT NULL, он будет медленным. http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/

Таблицы MyISAM кэшируют счет, поэтому счет () в таблице MyISAM всегда является немедленным. InnoDB занимает некоторое время, так как состояние таблицы может изменяться, и в итоге вы получите оценку. Вы можете сделать подсчет (colname) для InnoDB, где colname - это поле с автоматическим приращением. Это будет довольно быстро и точно, хотя и не так быстро, как считать () в таблицах MyISAM.

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