MySQL如何处理IN谓词

时间:2015-09-06 12:53:18

标签: mysql performance indexing

假设表T有三列,

 id int not null auto_increment,
 my_id int,
 name varchar(200). 

并且查询是"从T中选择*,其中my_id在(var_1,var_2,...,var_n)和name =' name_var'"。

以下两个指数之间是否有任何表现差异?

  • Index1:(my_id,name)
  • Index2 :( name,my_id)。

3 个答案:

答案 0 :(得分:1)

•Index1:(my_id,name) •Index2 :( name,my_id)。

是的,在查询性能方面,上面两个略有不同。

总是,最左边的字段是决定索引效率和选择性的最重要字段。 index应建立在WHERE,ORDER BY和GROUP BY子句中经常使用的列上。 希望这有帮助!

答案 1 :(得分:0)

在复合索引中,应首先显示要搜索的列。因此,如果您要搜索一组id值,则需要id首先显示在索引中。

但如果id是主键并且您使用SELECT *子句来检索整行,则添加另一个索引没有意义。表格的组织方式,行的所有数据都显示为每个id值。所以只需使用主键上的索引。

tl; dr:(id,name)(name,id)都无法帮助您进行此查询。

答案 2 :(得分:0)

通常,最好使用INDEXWHERE开始col = const。一个范围可以持续到最后。 IN有点像=,类似于范围。因此,这是最好的:

INDEX(name, id)

这样想。索引是一个有序列表。使用此索引,它将从name=...开始,然后必须扫描或跳过具有该名称的所有ID。

我怀疑PRIMARY KEY不是(id)。如果是的话,你为什么要检查这个名字?