|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Nick Kostirya 2:5020/400 24 Feb 2004 11:41:21 To : Alex Povolotsky Subject : Re: Страшная быль -------------------------------------------------------------------------------- "Alex Povolotsky" <tarkhil@over.ru> сообщил/сообщила в новостях следующее: news:87d68557dd.fsf_-_@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()... А если использовать MERGE таблицу для всех анекдотов, "распихав" каждую категорию в отдельную таблицу. Это лучше, чем каждый раз создавать временные таблицы. Только MERGE на 3 ветке немного глючило. Hо лучше, по моему, использовать тип Recno , что в Berkeley DB, в режиме изменения логических номеров записей, также распихав каждую категорию в отдельную таблицу. Тогда зная количество записей в каждой категории, сгенерировав случайные числа, выдергиваем нужные анекдоты. Скорость будет хорошая. P.S. Прошу прошения, что ушел в оффтопик. --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577cad2bd63.html, оценка из 5, голосов 10
|