mysql多个连接条件有多个表查询性能

时间:2012-03-28 07:48:55

标签: mysql database performance

假设表:

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秒钟来运行最大情况

4 个答案:

答案 0 :(得分:1)

CREATE INDEX id_main ON main(id)

您可以在其他列上创建多个索引,看看它是如何工作的。

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:1)

这实际上取决于具体情况,例如每个连接的选择性,每个表的大小等等。一般来说,在主表的外键上添加一个或多个索引可能是明智的,但谁可以说有限的信息?

也可能有助于了解查询的执行方式 - 尝试查看MySQL的“解释”或“解释扩展”。

答案 2 :(得分:0)

由于主键已默认编入索引,因此无法通过添加更多索引来优化连接。所以这留下了你的陈述。因此,它可以帮助向x.x_colN列添加索引。

答案 3 :(得分:0)

你应该在你的group_by上有一个索引我认为