Недавно был впечатлён размышлениями людей на тему оптимизации выборки произвольной записи из таблицы MySQL.
Конечно, выполненная работа впечатляет, но оправданы-ли такие трудозатраты на написание многострочного кода одним человеком, а затем, возможно, попытки понять его другим, причём часто без комментариев автора?
Такие сложности подходят для крупных проектов, где оптимизация должна быть абсолютной, а простым неперфекционистам, у которых нагрузка на сайт позволяет расслабиться, можно приложить усилия в другом направлении.
Поэтому хочу предложить простейшую альтернативу оптимизации запроса "… ORDER BY RAND() LIMIT 1;" вставкой в код условия «WHERE RAND()>0.9».
Вот результаты теста (взято две таблицы, каждый запрос выполнялся по два раза, результаты не кешировались):
таблица jos_squeezimages, 12804 записей, два поля: id (INT(11)) и fullname (VARCHAR(255))
запрос выполнялся 0,0324 сек первый раз и 0,0317 сек второй раз
0,0130 секунды, 0,0134 секунды
0,0112 секунды, 0,0111 секунды
таблица t_tovars, 20212 записей, 25 полей, по большей части varchar
0,1717 секунды, 0,1816 секунды
0,0735 секунды, 0,0642 секунды
0,0455 секунды, 0,0447 секунды
Вуаля!
Добавить условие в запрос очень просто, и времени на оптимизацию ушло немного, а скорость увеличилась в три раза.
А главное — не надо много думать :)
Конечно, выполненная работа впечатляет, но оправданы-ли такие трудозатраты на написание многострочного кода одним человеком, а затем, возможно, попытки понять его другим, причём часто без комментариев автора?
Такие сложности подходят для крупных проектов, где оптимизация должна быть абсолютной, а простым неперфекционистам, у которых нагрузка на сайт позволяет расслабиться, можно приложить усилия в другом направлении.
Поэтому хочу предложить простейшую альтернативу оптимизации запроса "… 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 секунды
Вуаля!
Добавить условие в запрос очень просто, и времени на оптимизацию ушло немного, а скорость увеличилась в три раза.
А главное — не надо много думать :)