mysql - 性能改进 : Left outer Join, Order By, Subquery: Index not picked by the main query

标签 mysql indexing query-optimization left-join

表 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/

相关文章:

mysql - 仅当行不具有多值之一时才对行进行求和

mongodb - 使用命令行从 MongoDB 数据库中的所有集合中删除所有索引

mysql - 优化mysql查询效率更高

android - 如何在本地机器上为 Android 手机设置服务器?

php - 如何在php作业调度程序功能页面中添加$id

php - 从第一个表中提取数据并使用其值从其他表中提取数据

sql - 忽略违反重复键索引的行的插入

SQLite 查询使用 TEMP B-TREE FOR ORDER BY 而不是索引

mysql - 如何使用子查询更好地优化这个 mySQL 查询

mysql - MySQL 查询运行缓慢 - 如何优化?