|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alex Povolotsky 2:5020/145 24 Feb 2004 10:17:18 To : "Nick Kostirya" Subject : Страшная быль -------------------------------------------------------------------------------- .RFC-X-Complaints-To: usenet@tarkhil.over.ru .RFC-NNTP-Posting-Date: Tue, 24 Feb 2004 06:17:19 +0000 (UTC) .RFC-User-Agent: Gnus/5.1002 (Gnus v5.10.2) XEmacs/21.4 (Reasonable Discussion,\n berkeley-unix) .RFC-Cancel-Lock: sha1:nQiAbSEvorlSINZDeC1Gem+lM0g= From: Alex Povolotsky <tarkhil@over.ru> "Nick Kostirya" <nick@han.kherson.ua> writes: >> Рассказать, что ли, страшную быль о том, как программист решал задачу с > БД?... > > Расскажите. Дано: сайт с анекдотами, который безбожно тормозит даже под не очень большой нагрузкой. Исследования показывают следующую картину: База анекдотов. Hомер (нумерация не сквозная), категория, текст. Hужно на каждой странице выдавать три случайных анекдота нужной категории. Как это решает программист? в цикле генерирует случайное число от 1 до максимального номера анекдота, выбирает (путем select *) анекдот. Если подходит - добавляет к списку, если нет - генерит еще один запрос. Пока не наберет три анекдота. Учитывая примерно два десятка категорий, заполненных более-менее равномерно, и примерно 20% пустых номеров - получаем, что для трех анекдотов нужно сделать как бы не полсотни запросов. Всегда с select *, а анекдоты бывают длинные... Жаль, он уже уволился. Убил бы... Кстати, при экспериментах выяснилось, что order by rand() у mysql работает, мягко говоря, не быстро. Оптимальный вариант - делать временную таблицу, в нее вытягивать категорию, и уже из таблицы в памяти - select * from temptable limit 3 order by rand()... -- Alex. --- ifmail v.2.15 * Origin: Minas Tirith (2:5020/145@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1044345ec4d8d.html, оценка из 5, голосов 10
|