2013-07-16 2 views
0

Может кто-нибудь мне помочь в оптимизации этого запроса:Как бы вы оптимизировали этот запрос mysql?

SELECT DISTINCT 
A.X1,  
A.X2 
FROM TABLEAA A 
JOIN TABLEBB B ON A.Y = B.Y AND B.Z1='SELECTED1' AND B.W NOT LIKE 'SLECTED3' 
JOIN TABLECC C ON A.Y = C.Y AND C.Z2='SELECTED2' 
AND A.W NOT LIKE 'SLECTED3' 

В то время как

TABLEAA: 1 миллион записей TABLEBB: 17 миллионов записей TABLECC: 1,2 миллиона записей

Это работает, но это занимает почти От 8 до 10 секунд.

Есть ли другой способ написать это?

изменить: первичный индекс на TableBB представляет собой комбинацию B.Z1 и B.Y. первичный индекс на TableCC представляет собой комбинацию C.Z2 и C.Y. первичный индекс в таблицеAA равен A.Y

+6

Выполнение 'explain' в запросе покажет вам отсутствующие индексы. – jordanm

+0

Каковы индексы на таблицах? – Kickstart

+0

'B.Z1 = 'SELECTED1'',' НЕ НРАВИТСЯ' SLECTED3'' - Я не знаю, что вы делаете, но это пахнет плохим дизайном схемы. –

ответ

0

Надеюсь, это лучше.

SELECT DISTINCT A.X1, A.X2 
FROM TABLEAA AS A 
INNER JOIN(TABLEBB AS B) 
    ON(A.Y = B.Y) 
INNER JOIN(TABLECC AS C) 
    ON(A.Y = C.Y) 
WHERE B.Z1 = 'SELECTED1' AND 
     B.W NOT LIKE '%SLECTED3%' AND 
     C.Z2='SELECTED2' AND 
     A.W NOT LIKE '%SLECTED3%' 
+1

Это, вероятно, будет значительно медленнее, так как ведущие дикие животные на B.W и A.W будут индексировать эти столбцы бесполезно. Без подстановочных знаков он не должен отличаться от исходного запроса. – Kickstart

Смежные вопросы