[英]optimize mysql join query using indexes
我有索引complex1(field2,field3)
用于在表table1
搜索,而index order1(field10)
用于对结果进行排序。 table1
是MySQL InndoDB表。 通过子查询我试图获得使用值complex1
指数,并通过主查询我想用命令他们order1
指数,只留下前50。
EXPLAIN(
SELECT `t1`.`field1`,`t1`.`field10` from `database`.`table1` `t1` INNER JOIN
(SELECT `field1` FROM `database`.`table1` WHERE
`field2` >= 'val1' and `field2`<='val2' `and `field3` >= 'val3' and `field3`<='val4'
) as e1
ON e1.`field1`=t1.`field1` ORDER BY t1.`field10` LIMIT 50)
结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 13 "Using temporary; Using filesort"
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 e1.field1 1
2 DERIVED table1 range complex1 complex1 8 NULL 13 "Using where; Using index"
当我看到complex1
使用和order1
没有。 为什么?
MySQL关于如何使用索引有很好的文档
您的子查询通过扫描field2
范围内的所有值来使用complex
索引。 如果field1
是一个主键,那么这也是在InnoDB的指数(如解释在这里 ),所以所有的字段可以在索引满意。
然后,您正在对field1
进行field1
。 由于该索引存在于表中,因此MySQL可能正在使用表上的主索引进行此联接。 因此,结果然后按field1
而不是 field10
。 因此,它必须进行文件排序以获得最终排序的结果。
如果field1
是主键,那么此查询不会做同样的事情吗?
SELECT `field1`, `field10`
FROM `database`.`table1`
WHERE `field2` >= 'val1' and `field2`<='val2' `and
`field3` >= 'val3' and `field3`<='val4'
order by field10 desc
limit 30
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.