думать — полезно...
Выборка произвольных записей в MySQL / MySQL / Хабрахабр
Проблема
Взяли тут аутсорсера написать небольшой и несложный код на PHP и MySQL. Была одна из задач — выбрать несколько произвольных записей из таблицы в базе MySQL. И что же сделал этот ленивый и глупый аутсорсер? Конечно же написал бред типа такого:
SELECT * FROM tTable ORDER BY RAND () LIMIT 10;
На первый взгляд все логично да и работает правильно. Выбираются 10 произвольных записей. Но если взглянуть на план выполнения этого запроса, то станет понятно почему я сложил дюжину матершинных ругательств в адрес глупого аутсорсера.
В процессе выполнения этого запроса MySQL записывает во временную таблицу все (!!!) строки исходной таблицы, с одним новым полем, в которое записываются результаты функции RAND () — т.е. набор произвольных значений. Затем эта временная таблица сортируется filesort по добавленному полю с произвольными значениями и далее выбираются первые 10 записей. Полный ппц. А теперь представтье что будет если в исходной таблице 10 000 записей. А что если 1 000 000? А что если эту выборку надо делать раз десять в секунду. Да тут любой супер-пупер сервер надолго уйдет в раздумья.
и еще...
Выборка случайной записи из таблицы базы данных MySQL — AdioDom.com
Помните причину по который мы начали искать альтернативный способ выборки случайной записи? Скорость! Итак как сравнить эти методы по времени выполнения. Я не буду вдаваться в описание железа и настроек программного обеспечения. Приблизительный результат:
* Медленнее всех оказался метод для Решения 1. Это будет 100% времени на выполнение.
* Решение 2 — занял 79%
* Решение 3 — 13%
* Решение 4 — 16%
два вывода — гугл рулит (впрочем, как всегда) и думать — полезно...
первоначальное решение было именно как у «ленивого аутсорсера»... ладно, зашевелилась мысль, что не айс это совсем, оказался прав.