Dinesh Nagar
Dinesh Nagar

Reputation: 768

mysql query optimization left join

I m using following mysql query to fetch some desired result but problem is that it is taking more time. Currently execution time for this query is 7456 ms which is unacceptable for my project, I want to optimize this query any idea?.

 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

Thanks

Upvotes: 0

Views: 75

Answers (1)

Gordon Linoff
Gordon Linoff

Reputation: 1269623

First, you do not need all the left outer join, because your where clause is undoing most of them. My guess is all could be turned into inner joins, but at the minimum:

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;

Second, you are doing filtering onticketstatus_tbl. You should have a composite index on ticketstatus_tbl(display_status, flag_color, ticket_status, question_id). If you can, change the ticket_status not in ('Close') to an affirmative statement: ticket_status in (Open, 'In Progress', . . .). This makes it easier to use the index.

This is a start.

Upvotes: 2

Related Questions