mysql在WHERE和in GROUP BY中使用索引
这是一个多对多表,每侧链接到表,每个表大约有70000条记录。多对多有大约530万条记录 两个“边”表都有外键引用(一个是“令牌”,另一个是“段落”)。为了找出包含给定标记的所有段落,我需要按照mysql在WHERE和in GROUP BY中使用索引,mysql,performance,indexing,Mysql,Performance,Indexing,这是一个多对多表,每侧链接到表,每个表大约有70000条记录。多对多有大约530万条记录 两个“边”表都有外键引用(一个是“令牌”,另一个是“段落”)。为了找出包含给定标记的所有段落,我需要按照 SELECT para_id FROM many_to_many WHERE token_id = 3333 GROUP BY para_id; 尽管“token_id”列是复合主键的“最左边”列,并且在para_id上有一个索引(由para_id外键使用),但这似乎运行得非常慢 我尝试过使用EXPL
SELECT para_id FROM many_to_many WHERE token_id = 3333 GROUP BY para_id;
尽管“token_id”列是复合主键的“最左边”列,并且在para_id上有一个索引(由para_id外键使用),但这似乎运行得非常慢
我尝试过使用EXPLAIN,但这似乎从未提到使用para_id索引。我的问题是:有可能让MySQL使用para_id索引吗?如果没有,如果我在查询中包含一个“JOIN paras on paras.ID=many_to_many.para_ID”,是否可以让它使用表“paras”的索引(在“ID”上)?这可能会导致性能提高吗?您可能需要通过
token\u id
字段索引many to\u many
。复合主键在这里没有帮助。请发布表的结构和解释
输出。为什么在没有聚合函数的查询中使用分组依据
?我敢打赌,selectdistinct
在这种情况下会更有效。@Sammitch-ah,有道理。非常感谢,我将对此进行探讨。如果你关心分数等问题,也许你应该给出答案。谢谢。。。我已经读到,实际上复合主索引的功能类似于普通的单字段索引,但只适用于复合主索引中最左边的元素(本例中为token_id)。但是你的建议让我觉得我还是应该做一些实验。。。