假设表:
main(1M行): id,a_id,b_id,c_id,d_id,amount,year,main_col
a(500行): id,a_col1,a_col2
b(2000行): id,b_col1,b_col2,b_col3
c(500行): id,c_col1,c_col2
d(1000行): id,d_col1,d_col2
我们有查询:
select sum(amounts), main_col
join a on a.id = main.a_id
join b on b.id = main.b_id
join c on c.id = main.c_id
join d on d.id = main.d_id
where a.a_col1 in (...)
and a.a_col2 in (..)
and b.b_col1 in (...)
and b.b_col2 in (...)
and b.b_col3 in (..)
and c.c_col1 in (..)
and c.c_col2 in (..)
and d.d_col1 in (..)
and d.d_col2 in (..)
and year = 2011
group by main.main_col
是否有人想在主表上创建索引以提高查询性能?
感谢
更新: 索引被添加到a,b,c,d表中,列显示在哪里 我已经在主表(a_id,b_id,c_id,d_id,main_col)上尝试了多个列索引,这些索引具有最好的性能,比如在a_id,b_id ...上添加单个索引,但它仍然不够快,不能满足要求,查询将花费7秒钟来运行最大情况
答案 0 :(得分:1)
CREATE INDEX id_main ON main(id)
您可以在其他列上创建多个索引,看看它是如何工作的。
答案 1 :(得分:1)
这实际上取决于具体情况,例如每个连接的选择性,每个表的大小等等。一般来说,在主表的外键上添加一个或多个索引可能是明智的,但谁可以说有限的信息?
也可能有助于了解查询的执行方式 - 尝试查看MySQL的“解释”或“解释扩展”。
答案 2 :(得分:0)
由于主键已默认编入索引,因此无法通过添加更多索引来优化连接。所以这留下了你的陈述。因此,它可以帮助向x.x_colN列添加索引。
答案 3 :(得分:0)
你应该在你的group_by上有一个索引我认为