Select… LIMIT… Медленная работа на больших выборках. MYSQL

346
21 декабря 2016, 01:58

Добрый день. Есть запрос:

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 запрос выполнятся жутко долго. Что можно сделать как можно оптимизировать.?

Answer 1

Filesort, да на таких объёмах (судя по параметрам LIMIT), ну никак быстро не сделать. А с учётом того, что сортировка идёт по полю подзапроса, т.е. по неиндексированному набору данных - не вижу потенции оптимизации этого запроса в принципе.

Предлагаю рассмотреть вариант трансформации запроса в процедуру. В ней сделать выборку подзапроса в TEMPORARY TABLE ENGINE=Memory, проиндексировать, а уж потом получать итоговую выборку. Чем на большее число записей распадается подзапрос после связывания с другими таблицами, тем больше шанс поиметь профит... да, сам подзапрос (отбор во временную) тоже следует залимитировать, или во всяком случае постараться это сделать.

READ ALSO
Сервлет для web приложения

Сервлет для web приложения

Есть БД MySQL с таблицей mytable (column ID, column NAME), пишу приложение для вывода в файл HTML результатов выполнения хранимых процедур (вывести таблицу,...

375
Неполучения исправить ошибку [дубликат]

Неполучения исправить ошибку [дубликат]

На данный вопрос уже ответили:

291
Выборка из Many-to-many таблиц по заданному ID

Выборка из Many-to-many таблиц по заданному ID

Таблицы: Животные, Клетки, Смотрители

285
Добавить больше данных в html таблицу

Добавить больше данных в html таблицу

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

303