使用索引优化mysql连接查询

时间:2013-04-20 14:37:32

标签: mysql performance indexing

我有complex1(field2,field3)索引用于在table1index 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"

我看到使用了complex1order1没有使用{{1}}。为什么呢?

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