Оптимизация запросов с количеством объединяемых таблиц и упорядочением по предложению limit - PullRequest
0 голосов
/ 01 июля 2011

У меня есть запрос, который объединяет несколько таблиц, используя условие 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),но я получаю синтаксическую ошибку при выполнении этого запроса.В сообщении об ошибке указывается неправильный синтаксис около

У меня есть один составной индекс для столбца, который используется в порядке по выражению.Я также попытался создать один индекс для этого столбца, но на самом деле ничего не работает.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

MySQL может использовать ключи для сортировки вместо сортировки результата после извлечения данных, но только при соблюдении нескольких условий.Вы можете увидеть список этих условий здесь: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

В вашем случае, я думаю, что множественные соединения препятствуют быстрой сортировке.Один из упомянутых случаев, когда MySQL не может использовать индекс для сортировки:

Вы объединяете много таблиц, и столбцы в ORDER BY не все из первой непостоянной таблицы, которая являетсяиспользуется для получения строк.(Это первая таблица в выводе EXPLAIN, которая не имеет типа соединения const.)

Я не уверен, есть ли способ обойти это.Это зависит от структуры таблиц и фактического запроса.

Чтобы получить дополнительную помощь, попробуйте опубликовать вывод объяснения упорядоченного запроса.

0 голосов
/ 01 июля 2011

Сначала я бы попытался добавить составные индексы для:

Table a
    (col2, col1)

Table b
    (col4, col1)

и простой индекс для

Table h
    (col5)
...