2016-01-21 104 views
0

我正在试图执行此查询,但它需要超过5个小时,但数据库大小仅为20mb。这是我的代码。在这里,我加入了reg_id的11个表格。我需要具有不同值的所有列。请指导我如何重新排列查询。Sql加入需要很多时间

SELECT * 

FROM degree 

JOIN diploma 
ON degree.reg_id = diploma.reg_id 
JOIN further_studies 
ON diploma.reg_id = further_studies.reg_id 
JOIN iti 
ON further_studies.reg_id = iti.reg_id 
JOIN personal_info 
ON iti.reg_id = personal_info.reg_id 
JOIN postgraduation 
ON personal_info.reg_id = postgraduation.reg_id 
JOIN puc 
ON postgraduation.reg_id = puc.reg_id 
JOIN skills 
ON puc.reg_id = skills.reg_id 
JOIN sslc 
ON skills.reg_id = sslc.reg_id 
JOIN license 
ON sslc.reg_id = license.reg_id 
JOIN passport 
ON license.reg_id = passport.reg_id 
GROUP BY fullname 

请帮助我,如果我没有任何错误

+2

请同时为每个表添加'DESCRIBE tablename'的输出,并在上面的查询中添加'EXPLAIN querycode'。最可能的原因是滥用指数。 – Amadan

+1

您正在选择全部,为什么选择GROUP BY?并需要更多细节。 – Metaphor

+0

@Metaphor我正在使用GROUP BY获取不同的值 –

回答

6

这是长注释了一下。

您的查询的第一个问题是您使用select *group by fullname。您在select中有大量列不在group by中。除非你真的,真的,真的知道你在做什么(我怀疑),这是编写查询的错误方法。

您的性能问题无疑是由于笛卡尔产品和缺乏索引。你正在加入不同的维度 - 比如技能和学位。结果是所有可能性的产物。对于一些人来说,数据量可能会增长,增长和增长。

然后,问题是:你有关于在连接中使用的键索引?对于性能,你通常需要这样的索引。

+0

“一般”? :D – Amadan

+0

@Amadan我可以看到有索引权衡的情况下比没有他们,即广泛的插入与罕见的读取等 – vittore

+0

我可以争辩说,如果插入的吞吐量是那么大,数据库本身*巨大的* - 然后你真的不想在没有索引的情况下进行任何连接,而不是不频繁的连接。关闭大容量插入索引,重新启用查询索引;或者没有连接而生活。然后再次,你可能知道我不... – Amadan

0

我想这个问题是在query.First确保组的全名,并尝试给出一些列名,而不是*