У меня есть запрос, который объединяет несколько таблиц, используя условие distincct - left join - order by - limit.
Запрос выглядит так: -
Select DISTINCT a.col1, b.col2, c.col3, d.col4, e.col5, f.col6, g.col7, h.col8,
i.col9, j.col10
From test_a a
left join test_b b on a.col1 = b.col2
left join test_c c on c.col1 = d.col2
left join test_d d on d.col1 = c.col2
left join test_e e on e.col1 = d.col2
left join test_f f on f.col1 = e.col2
left join test_g g on g.col1 = f.col2
left join test_h h on h.col1 = a.col1
left join test_i i on i.col1 = f.col2
left join test_j j on j.col1 = i.col2
Where a.col2 = 'Y'
and c.col4 = 1
Order by h.col5 desc
limit 50;
Все используемые столбцыв кодировках есть индекс.И объяснение результатов этого запроса дает набор результатов, где я вижу, что он правильно использует весь индекс, и общее количество строк, отсканированных из всех таблиц, составляет 18000.
Что мне интересно в этом запросе?Он запускается в течение нескольких секунд, если я запускаю его без заказа по предложению.Что-то вроде:
Select DISTINCT a.col1, b.col2, c.col3, d.col4, e.col5, f.col6, g.col7, h.col8,
i.col9, j.col10
From test_a a
left join test_b b on a.col1 = b.col2
left join test_c c on c.col1 = d.col2
left join test_d d on d.col1 = c.col2
left join test_e e on e.col1 = d.col2
left join test_f f on f.col1 = e.col2
left join test_g g on g.col1 = f.col2
left join test_h h on h.col1 = a.col1
left join test_i i on i.col1 = f.col2
left join test_j j on j.col1 = i.col2
Where a.col2 = 'Y'
and c.col4 = 1
limit 50;
И если я запускаю его с предложением order by, тогда выполнение занимает 30-40 секунд.
Я пытался использовать функцию подсказки индекса, предоставляемую mysql:- USE INDEX FOR ORDER BY (idx_h_col5)
,но я получаю синтаксическую ошибку при выполнении этого запроса.В сообщении об ошибке указывается неправильный синтаксис около
У меня есть один составной индекс для столбца, который используется в порядке по выражению.Я также попытался создать один индекс для этого столбца, но на самом деле ничего не работает.