parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Misha v.3 08.10.2007 13:57 / 08.10.2007 13:58

потому, что при этом происходит сортировка _всей_ таблицы (без использования индексов, понятное дело), temporary таблица и filesort гарантированы, что при увеличении количества записей до некоторого предела (тут влияют настройки SQL сервера) даёт гарантированные тормоза.

эти тормоза могут начаться много позже момента написания кода, когда количество записей увеличится. я не знаю до какого значения возрастёт их количество и через сколько времени это произойдёт, но писать код, содержащий подобную бомбу -- не в моих правилах.

я всегда вместо выборки _одной_ случайной записи с помощью order by rand() делаю select count + select ... + $.limit(1) $.offset(^math:rand(количество)).

более того, в уже написанном до меня коде приходилось вносить подобные правки не раз и не два (начинались тормоза). алгоритм поиска тормозов всегда одинаковый:
1. @USE MySQL.p
2. global replace table::sql -> oSql.table & Co
3. reading sql.log
4. поиск тормозных запросов и их исправление

P.S. последний раз пользовался этим алгоритмом 15 минут назад. убил бы того, что вместо SELECT COUNT(*) написал SELECT ..., а потом $iCount(^tData.count[]) :(