繁体   English   中英

使用索引优化mysql连接查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM