0

我有complex1(field2,field3)用于搜索table1index order1(field10)排序结果的索引。这table1是 MySQL IndoDB 表。通过子查询,我尝试使用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且未使用。为什么?

4

1 回答 1

0

MySQL 有很好的关于如何使用索引的文档

您的子查询complex通过扫描范围内的所有值来使用索引field2。如果field1是主键,那么它也在 InnoDB 索引中(如此所述),因此所有字段都可以在索引中得到满足。

然后你正在加入field1。因为这个索引存在于表上,MySQL 可能正在使用表上的主索引来进行这个连接。因此,结果然后按field1not 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 
于 2013-04-20T15:45:55.330 回答