Добрый день. Есть запрос:
select
t1.id,
t1.f1,
t1.f2,
t1.f3,
t1.f4,
t2.date,
t3.f5,
t2.f6,
t2.f7 FROM (
select
date,
id,
f7,
f6,
f8
FROM t2
WHERE t2.date >= ? and t2.date <= ?
) as t2 INNER JOIN t1 on t2.id = t1.f9 LEFT JOIN t3 on t2.f8=t3.id ORDER BY t2.date LIMIT 5499945,99999
Проблема в том что при больших значениях LIMIT OFFSET запрос выполнятся жутко долго. Что можно сделать как можно оптимизировать.?
Filesort, да на таких объёмах (судя по параметрам LIMIT), ну никак быстро не сделать. А с учётом того, что сортировка идёт по полю подзапроса, т.е. по неиндексированному набору данных - не вижу потенции оптимизации этого запроса в принципе.
Предлагаю рассмотреть вариант трансформации запроса в процедуру. В ней сделать выборку подзапроса в TEMPORARY TABLE ENGINE=Memory, проиндексировать, а уж потом получать итоговую выборку. Чем на большее число записей распадается подзапрос после связывания с другими таблицами, тем больше шанс поиметь профит... да, сам подзапрос (отбор во временную) тоже следует залимитировать, или во всяком случае постараться это сделать.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей