2016-05-16 66 views
0

我有一个查询在where子句中使用外键和其他列(比如c1)。默认情况下,外键被编入索引。当我添加索引到c1并运行explain命令时,查询仅占用搜索的外键,而不是索引的c1。MYSQL多列索引

我不应该为外键和其他列创建单个索引。我试着阅读与索引相关的评论,任何建议都会非常感谢。

表: 学生:ID,名称,年份,Class_tutor_id

ClassTutor:ID,姓名

选择的名字从学生 其中Class_tutor_id在 (从ClassTutor选择ID,其中name = '莎莉') 和年份> = 200和年份< = 2006;

我在年份字段中创建了索引。 Class_tutor_id是引用ClassTutor表id的外键。当我使用explain命令执行查询时,在“Keys”列下我得到了外键Class_tutor_id,但在“Possible keys”列中,我得到了外键,主键,年

+2

编辑你的问题,并显示查询和表定义(或至少索引)。没有足够的信息来真正提供有效的指导。 –

回答

0
+0

我需要在每列上使用单独的索引。我创建了单独的索引。在“EXPLAIN”命令中,我没有在类型列中获得“索引合并”。新创建的索引未考虑在内。还有其他的方法吗? – User12121

+0

对于where子句不能使用两个单独的索引。如果你想使用两列,你必须创建一个包含它们的新索引。 –

+0

当我创建包含它们两个的新索引时,只能使用外键。它没有工作。新索引也未被使用 – User12121

0

不要使用IN (SELECT ...),它表现不佳。使用JOIN来代替:

Select s.name 
    from Student AS s 
    JOIN ClassTutor AS ct ON ct.id = s.Class_tutor_id 
    where ct.name='Sally' 
     and s.year>=200 
     and s.year<=2006; 

然后将使用这些指标之一,并且是 '最佳':

Student: INDEX(year) 
ClassTutor: INDEX(name, id) -- "composite" and "covering" 

不要USEFORCEINDEX;它可能有助于今天,但明天会受伤。

“每列单独索引”意味着你还没有学习“复合”索引的权力。看我的cookbook

FOREIGN KEY是本次讨论中的红色听证会;关注必要的索引(es)。