Ответов: 18 Просмотров: 125
|
Даже если мы не смогли переписать запрос (например, убрав джойны) и запускаем тот же запрос с count, то в любом случае отсутствие сортировки и возможность быстрого выполнения за счет
http://sqlinfo.ru/forum/viewtopic.php?pid=38342#p38342 пишет:
1. SQL_CALC_FOUND_ROWS работает так: считает количество строк, которое выведет этот запрос без LIMIT. Т.е. берет
первую строку, считает, берет вторую строку, считает, берет третью строку, считает, и т.д.
2. SELECT COUNT(*) подвержен некоторым оптимизациям. Например, в случае с MyISAM,
он сразу знает ответ. В случае с InnoDB он вынужден бежать по PK, но он никогда не
заглядывает в листья за данными.
3. Наконец, в самом худшем случае, когда и тот, и другой алгоритмы вынуждены просма-
тривать и считать строки, случай с COUNT(*) не требует передачи самих данных в считалку
(а COUNT_FOUND_ROWS требует, т.к. иначе не умеет).
По сути, COUNT(*) отдельно работает всегда не медленнее, чем вариант «в лоб».
Да, в приведенных вами условиях один запрос может быть быстрее, но что почти наверняка - очень спорно.
P.S. Имхо, основная проблема в том, что SQL_CALC_FOUND_ROWS считают оптимизацией и применяют не к месту. А это очень чревато. О чем собственно и было моё первое сообщение. |