我有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
没有使用{{1}}。为什么呢?
答案 0 :(得分:0)
MySQL对如何使用索引有good documentation
您的子查询通过扫描complex
范围内的所有值来使用field2
索引。如果field1
是主键,那么它也在InnoDB索引中(如here所解释的那样),因此可以在索引中满足所有字段。
然后你正在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