表 1:
pk1 pk2 pk3 field1 field2 修改日期版本
表 2:
pk1 pk3 tab1 tab2 tab3
(pk1,pk2)-table1 的主键 (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,modifieddate,pk2,field3)
index2(pk1,modifieddate,pk2,field3)
foreignkeyindex(pk1,pk3)
subqueryindex(pk1,pk3,field2)
我分析了一下,发现在外层查询中使用OR是不占用索引的原因。 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html-- > Stephen Dewey 的最后评论。
我浏览了很多 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
能否请您帮助优化此查询? :)
最佳答案
您加入使用
tab1.pk1 =tab2.pk1 AND tab1.pk3 = tab2.pk3)
尝试使用您用来加入的键创建索引,即
table1: index1(pk1,pk3)
table2: index2(pk1,pk3)
关于mysql - 性能改进 : Left outer Join, Order By, Subquery: Index not picked by the main query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8753539/