Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
SELECT * FROM comments WHERE id <= (rand()*100000) ORDER BY id DESC LIMIT 1;SELECT * FROM comments WHERE id <= 63244 ORDER BY id DESC LIMIT 1;SELECT COUNT(*) FROM testЭтот запрос выполняется условно-мгновенно, не обращаясь к собственно данным таблицы.SELECT t.pk_id FROM test as t,
(SELECT ROUND((SELECT COUNT(*) FROM test) * rand()) as rnd FROM test LIMIT 1) t
WHERE t.pk_id = rndя получил более чем десятикратное ускорение выполнения.select * from table
where id in (
select trunc(rand()*cnt.cnt+1)
from (select count(*) as cnt from table) as cnt
cross join (select null from table limit :demanded_ranom_records_count) as pivot
)
(SELECT table_rows as tr FROM information_schema.tables WHERE table_name = 'test')
(SELECT tt.pk_id FROM test AS tt ORDER BY tt.pk_id DESC LIMIT 1)
MAX или ORDER BY + LIMIT — практически все равно.TABLE_SCHEMA="foobar" в WHERE. Это значит, что при запросе сервер построит список всех каталогов в datadir-е, и в каждом будет пытаться найти файл test.frm. У хостеров этих каталогов могут быть тысячи. Во-вторых, table_rows из I_S.TABLES — это быстрая, но приблизительная оценка количества строк в таблице. Точная она в MyISAM (где COUNT(*) и так быстрый), но не в InnoDB (где точный результат — COUNT(*) — весьма медленный).
MySQL. Выбор случайных строк в один запрос