Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Постраничная навигация, limit, count VS sql_calc_found_rows
 
 автор: jonik   (27.09.2011 в 13:14)   письмо автору
 
 

Доброго времени суток! По этому вопросу конечно много информации в интернете, но хотелось бы услышать мнение профессионалов.

Итак.... постраничная навигация......

До недавнего времени я думал, что SQL_CALC_FOUND_ROWS - единственное верное решение... Всегда стараюсь пользоваться штатными функциями, посему считал эту штуковину - дичайше полезным изобретением))....... Но недавно в интеренте прочитал очень ругательные отзывы... люди говорят, что эта штуковина дико тормозит и не использует индексы........ Лично проверил - реально очень сильно замедляет, хотя ИМХО индексы тут не причем, т.к. при индексировании скорость все равно увеличивается (значит индексы работают), но все равно работает в 5-10 раз медленнее, чем без применения Calc_rows.....

Получается, что единственным вариантом остается - делать 2 запроса..... 1 - count, 2- сам селект с LIMIT
Просто немного не нравится, что тяжелый запрос будет выполняться 2 раза.......
Собственно вопрос вот в чем...Есть ли какой-либо еще способ узнать сколько всего записей попадает под условие, без учета LIMIT?

  Ответить  
 
 автор: cheops   (27.09.2011 в 17:45)   письмо автору
 
   для: jonik   (27.09.2011 в 13:14)
 

Да, эти обвинения в сторону SQL_CALC_FOUND_ROWS не безпочвенные, запрос вынужден выполняться полностью. И если в случае COUNT(*) его можно оптимизировать, то в случае SQL_CALC_FOUND_ROWS избежать полного скана практически невозможно. Несколько запросов - это не страшно, главное, чтобы они быстро отрабатывали, страшно, когда выполняется большой медленый запрос, да к тому же блокирующий таблицу для остальных запросов.

Вообще в MySQL LIMIT и его обслуживание реализованы не самым блестящим образом, например при LIMIT 10000, 10 у вас будут выбраны все 10010 записей, благо что у пользователей терпения обычно хватает только на первые несколько страниц.

  Ответить  
 
 автор: jonik   (28.09.2011 в 11:52)   письмо автору
 
   для: cheops   (27.09.2011 в 17:45)
 

Спасибо большое за грамотный ответ! Теперь просто закрою эту тему и всегда буду использовать COUNT(*).... И главное, это меня научило - обязательно проверять такие штуки, которые, на первый взгляд, кажутся простыми и правильными, а на деле выходит все наоборот.........

И, кстати, вопрос в догоночку.... Не планируете ли Вы выпустить книгу, которая будет посвящена именно правильному проектированию приложений, чтобы там рассматривались темы оптимизации, многослойной архитектуры и т.п.?

  Ответить  
 
 автор: cheops   (28.09.2011 в 13:51)   письмо автору
 
   для: jonik   (28.09.2011 в 11:52)
 

Тут одной книгой обойтись не получится. Архитектура она обычно такие штуки как оптимизация игнорирует, более того, жертвует оптимизацией во имя стройности архитектуры и кода менее подверженного ошибкам. Когда же речь заходит об оптимизации, то, как правило, это всегда рефакторинг - т.е. оптимизация уже готового кода, так как со времен Дональда Кнута преждевременная оптимизация признана злом (не будем сейчас вдаваться в объяснения почему и как). Т.е. фактически нужно писать две книги - одна об архитектуре, другая об рефакторинге. Таких книг уже существует не мало, пусть не по PHP и Web. Да и сложно писать такие книги в условиях Web - слишком он разнокалиберный (то 1000 сайтов на одном сервере, то 1 сайт на 1000 серверах) и все постоянно меняется: мощность, мода, приоритеты, инструменты. Пишешь книгу - срок жизни ей 3 года, потом с 0 нужно переписывать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования