2012-04-26 140 views
1

有什么方法可以针对速度优化以下查询:大约需要6秒钟才能执行。每张表只包含大约1000条记录,所以它不是很大。MySQL查询速度加入

SELECT c. * , q.qualification_name, CONCAT(u.firstname, ' ', u.lastname) AS name, v.venue_name, v.address_town 
FROM p_courses c 
LEFT JOIN p_qualifications q ON c.qualification_name = q.ref 
LEFT JOIN p_users u ON c.instructor_number = u.instructor_number 
LEFT JOIN p_venues v ON c.venue_token = v.token 
WHERE (
c.status = 'completed' 
OR c.status = 'confirmed' 
) 

上面的查询工作,并根据要求检索所有的数据,它只是需要很长的时间,只要我添加多个LEFT JOIN。

谢谢。

EDITED。

添加解释该查询返回该前面...

id select_type table type possible_keys key key_len ref  rows Extra 
1 SIMPLE  c  ALL  NULL   NULL NULL  NULL 1288 Using where 
1 SIMPLE  q  ALL  NULL   NULL NULL  NULL 21 
1 SIMPLE  u  ALL  NULL   NULL NULL  NULL 518 
1 SIMPLE  v  ALL  NULL   NULL NULL  NULL 669 

很抱歉,但我不太知道如何解释这一点。

回答

0
  1. EXPLAIN放在查询前面检查有什么问题。
  2. 设置您的indeces以便您的连接和您的位置可以使用它们。
  3. 再检查一下EXPLAIN
  4. 泡沫,冲洗,重复。

提示:你可能想在一个索引:

c.qualification_name 
q.ref 
c.instructor_number 
u.instructor_number 
c.venue_token 
v.token 
c.status 
+0

对不起,我知道格式是可怕的。 – Rob 2012-04-26 11:03:25

+0

你应该在你的问题中修改它,修正那里的格式,但最重要的是,检查它并看看你能从中找出什么。正如我所说的,你需要在你加入的领域的索引/ /执行一个在哪里,所以添加索引,并看看是否有帮助。不要只转储一个解释,试试我建议:) – Nanne 2012-04-26 11:05:30

+0

格式化固定。所以看起来我需要在这些字段上添加索引。 – Rob 2012-04-26 11:13:42

0

从您发布它看起来并不像查询使用索引的解释。确保q.ref,u.instructor_number和v.token被编入索引

+0

感谢您的帮助。 – Rob 2012-04-26 11:21:40