повышение производительности: левое внешнее объединение, упорядочение по, подзапрос: индекс не обнаружен основным запросом - PullRequest
2 голосов
/ 06 января 2012

таблица 1:

pk1 pk2 pk3 field1 field2 модифицированная версия даты

таблица 2:

pk1 pk3 tab1 tab2 tab3

(pk1, pk2)-применный ключ для таблицы1 (pk1, pk3) -примарный ключ для таблицы2

pk1, pk3 -известный ключ

Пример запроса выглядит следующим образом:

select *.tab1, tab2.field1
from table1 tab1
LEFT JOIN table2 tab2
ON (tab1.pk1 =tab2.pk1 AND tab1.pk3 = tab2.pk3)
WHERE (tab1.pk1= 'xx' OR tab1.pk1 = 'yy')
AND (tab1.pk3 = 'aa' OR tab1.pk3 is null)
AND (tab1.modifieddate >'somevalue' OR (tab1.modifieddate = 'somevalue' AND tab1.pk2 >    ' \n') )
AND tab1.field1 = (select max(field1) from table1
where ((tab1.pk1= 'xx' OR tab1.pk1 = 'yy') 
AND (tab1.pk3 = 'aa' OR tab1.pk3 is null) AND field3 = tab1.field3))
ORDER BY modifieddate desc,pk1 desc
limit 0,50

Созданы следующие индексы:

index1 (pk1, pk3, измененная дата, pk2, поле3)

index2 (pk1, измененная дата, pk2, поле3)

foreignkeyindex (pk1, pk3)

subqueryindex (pk1, pk3, field2)

Анализируя, я обнаружил, что использование OR во внешнем запросе является причиной того, что индекс не берется.http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html--> последний комментарий Стивена Дьюи.

Я просмотрел много сообщений от stackoverflow и попытался использовать UNION ALL.В этом случае для моего сценария я получил производную таблицу.Можно ли создать производную таблицу для использования индексов?


РЕДАКТИРОВАТЬ Объяснить план:

id select-type          table   type        possible_keys             key       key-len   ref          rows     extra
1   primary             tab1    range       primary,index1,index2      pk3       497      null           734     using where;using filesort
2   primary             tab2    ref         primary,forignkeyindex,pk3 pk3       110   db.tab1.pk3         1       
3   dependent subquery  table1  ref_or_null pk3,subqueryindex     subqueryindex  497  tab1.pk3,tab1.field1 2     using where

Не могли бы вы помочь с оптимизацией этого запроса?:)

1 Ответ

0 голосов
/ 16 апреля 2012

Вы присоединяетесь, используя

tab1.pk1 =tab2.pk1 AND tab1.pk3 = tab2.pk3)

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

...