2013-08-24 198 views
0

我使用以下mysql查询来获取一些期望的结果,但问题是它需要更多时间。目前这个查询的执行时间是7456毫秒这是我的项目无法接受的,我想优化这个查询任何想法?mysql查询优化左连接

SELECT *, DATEDIFF(NOW(),ticketstatus_tbl.updation_date) AS problem_age,images_tbl.image_path 
      FROM ticketstatus_tbl 
      LEFT JOIN question_tbl ON ticketstatus_tbl.question_id = question_tbl.question_id 
      LEFT JOIN ticketing_tbl ON ticketstatus_tbl.related_ticket_id = ticketing_tbl.ticket_id 
      LEFT JOIN department_tbl ON question_tbl.question_dept = department_tbl.department_id 
      LEFT JOIN branch_tbl ON ticketstatus_tbl.branch_id = branch_tbl.id 
      LEFT JOIN images_tbl ON images_tbl.question_id = ticketstatus_tbl.question_id and images_tbl.branch_id = ticketstatus_tbl.branch_id 
      WHERE (ticketstatus_tbl.ticket_status NOT IN ('Close') 
      AND question_tbl.is_active_question = 1 
      AND ticketstatus_tbl.display_status = '1' 
      AND ticketstatus_tbl.flag_color = 'Yellow' 
      AND department_tbl.department_name = 'Admin')order by ticket_number ASC LIMIT 0 ,5 

感谢

+0

请张贴你在表格上的索引和查询的解释。 –

+0

表结构和EXPLAIN输出,或者不期望有意义的答案。 http://dev.mysql.com/doc/refman/5.6/en/explain.html – Mchl

+0

将索引放在ON子句中使用的列上通常会帮助很多人。当然,你在数据库中没有其他奇怪的事情发生。这就是为什么我们可能需要更多信息来帮助你。 – Hless

回答

2

首先,你并不需要所有的left outer join,因为你的where子句撤销其中的大多数。我的猜测是所有可以变成内部连接,但在最低限度:

SELECT *, DATEDIFF(NOW(),ticketstatus_tbl.updation_date) AS problem_age,images_tbl.image_path 
FROM ticketstatus_tbl 
      JOIN question_tbl ON ticketstatus_tbl.question_id = question_tbl.question_id 
      LEFT JOIN ticketing_tbl ON ticketstatus_tbl.related_ticket_id = ticketing_tbl.ticket_id 
      JOIN department_tbl ON question_tbl.question_dept = department_tbl.department_id 
      LEFT JOIN branch_tbl ON ticketstatus_tbl.branch_id = branch_tbl.id 
      LEFT JOIN images_tbl ON images_tbl.question_id = ticketstatus_tbl.question_id and images_tbl.branch_id = ticketstatus_tbl.branch_id 
WHERE ticketstatus_tbl.ticket_status NOT IN ('Close') 
      AND question_tbl.is_active_question = 1 
      AND ticketstatus_tbl.display_status = '1' 
      AND ticketstatus_tbl.flag_color = 'Yellow' 
      AND department_tbl.department_name = 'Admin' 
order by ticket_number ASC LIMIT 0 ,5; 

其次,你正在做的ticketstatus_tbl过滤。你应该在ticketstatus_tbl(display_status, flag_color, ticket_status, question_id)上有一个复合索引。如果可以,请将ticket_status not in ('Close')更改为肯定性声明:ticket_status in (打开, 'In Progress', . . .)。这使得索引更容易使用。

这是一个开始。

+0

grt :)戈登你的诀窍实际上问题是在images_tbl。它包含将近15,000行,并且我正在执行左连接,导致执行时间很长。现在使用内部连接和images_tbl执行时间降至300毫秒。谢谢 –

+0

@DineshNagar如果这个答案解决了你的问题,请选择它作为正确的答案。如果没有,或者您想添加它,请添加您自己的答案,并选择该答案作为您的首选答案。 – Technoh