Как стать автором
Поиск
Написать публикацию
Обновить

Оптимизация «ORDER BY RAND() LIMIT 1» — не абсолют, но намного проще

Недавно был впечатлён размышлениями людей на тему оптимизации выборки произвольной записи из таблицы MySQL.

Конечно, выполненная работа впечатляет, но оправданы-ли такие трудозатраты на написание многострочного кода одним человеком, а затем, возможно, попытки понять его другим, причём часто без комментариев автора?

Такие сложности подходят для крупных проектов, где оптимизация должна быть абсолютной, а простым неперфекционистам, у которых нагрузка на сайт позволяет расслабиться, можно приложить усилия в другом направлении.

Поэтому хочу предложить простейшую альтернативу оптимизации запроса "… ORDER BY RAND() LIMIT 1;" вставкой в код условия «WHERE RAND()>0.9».

Вот результаты теста (взято две таблицы, каждый запрос выполнялся по два раза, результаты не кешировались):

таблица jos_squeezimages, 12804 записей, два поля: id (INT(11)) и fullname (VARCHAR(255))

SELECT fullname FROM `jos_squeezimages` ORDER BY RAND() LIMIT 1;
запрос выполнялся 0,0324 сек первый раз и 0,0317 сек второй раз

SELECT fullname FROM `jos_squeezimages` WHERE RAND()>0.9 ORDER BY RAND() LIMIT 1;
0,0130 секунды, 0,0134 секунды

SELECT fullname FROM `jos_squeezimages` WHERE RAND()>0.999 ORDER BY RAND() LIMIT 1;
0,0112 секунды, 0,0111 секунды

таблица t_tovars, 20212 записей, 25 полей, по большей части varchar
SELECT * FROM `t_tovars` ORDER BY RAND() LIMIT 1;
0,1717 секунды, 0,1816 секунды

SELECT * FROM `t_tovars` WHERE RAND()>0.9 ORDER BY RAND() LIMIT 1;
0,0735 секунды, 0,0642 секунды

SELECT * FROM `t_tovars` WHERE RAND()>0.999 ORDER BY RAND() LIMIT 1;
0,0455 секунды, 0,0447 секунды

Вуаля!
Добавить условие в запрос очень просто, и времени на оптимизацию ушло немного, а скорость увеличилась в три раза.

А главное — не надо много думать :)
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.