0

次のmysqlクエリを使用して目的の結果を取得していますが、時間がかかるという問題があります。現在、このクエリの実行時間は 7456 ミリ秒であり、これは私のプロジェクトでは受け入れられません。このクエリを最適化したいと考えていますか?

 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

ありがとう

4

1 に答える 1

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 (Open , 'In Progress', . . .)。これにより、インデックスを簡単に使用できます。

これが始まりです。

于 2013-08-24T13:07:21.403 に答える