[Solved] Performance Mysql

How to optimize this SQL query?

In case you have your own slow SQL query, you can optimize it automatically here.

For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:

  1. Description of the steps you can take to speed up the query.
  2. The optimal indexes for this query, which you can copy and create in your database.
  3. An automatically re-written query you can copy and execute in your database.
The optimization process and recommendations:
  1. Avoid Subqueries In From Clause (modified query below): The database cannot properly optimize subqueries in the FROM clause. Therefore, we recommend to extract the subqueries to temporary tables, index them and join to them in the outer query.
  2. Avoid using too many joins (modified query below): Using too many joins can complicate the query's readability and the ability of the database optimizer to optimize the query.
  3. Create Optimal Indexes (modified query below): The recommended indexes are an integral part of this optimization effort and should be created before testing the execution duration of the optimized query.
  4. Explicitly ORDER BY After GROUP BY (modified query below): By default, the database sorts all 'GROUP BY col1, col2, ...' queries as if you specified 'ORDER BY col1, col2, ...' in the query as well. If a query includes a GROUP BY clause but you want to avoid the overhead of sorting the result, you can suppress sorting by specifying 'ORDER BY NULL'.
Optimal indexes for this query:
ALTER TABLE `es_temp1` ADD INDEX `es_temp1_idx_task_id` (`task_id`);
ALTER TABLE `es_temp10` ADD INDEX `es_temp10_idx_task_id` (`task_id`);
ALTER TABLE `es_temp11` ADD INDEX `es_temp11_idx_task_id` (`task_id`);
ALTER TABLE `es_temp12` ADD INDEX `es_temp12_idx_task_id` (`task_id`);
ALTER TABLE `es_temp13` ADD INDEX `es_temp13_idx_task_id` (`task_id`);
ALTER TABLE `es_temp14` ADD INDEX `es_temp14_idx_task_id` (`task_id`);
ALTER TABLE `es_temp15` ADD INDEX `es_temp15_idx_task_id` (`task_id`);
ALTER TABLE `es_temp16` ADD INDEX `es_temp16_idx_task_id` (`task_id`);
ALTER TABLE `es_temp17` ADD INDEX `es_temp17_idx_task_id` (`task_id`);
ALTER TABLE `es_temp18` ADD INDEX `es_temp18_idx_task_id` (`task_id`);
ALTER TABLE `es_temp19` ADD INDEX `es_temp19_idx_task_id` (`task_id`);
ALTER TABLE `es_temp2` ADD INDEX `es_temp2_idx_task_id` (`task_id`);
ALTER TABLE `es_temp20` ADD INDEX `es_temp20_idx_task_id` (`task_id`);
ALTER TABLE `es_temp3` ADD INDEX `es_temp3_idx_task_id` (`task_id`);
ALTER TABLE `es_temp4` ADD INDEX `es_temp4_idx_task_id` (`task_id`);
ALTER TABLE `es_temp5` ADD INDEX `es_temp5_idx_task_id` (`task_id`);
ALTER TABLE `es_temp6` ADD INDEX `es_temp6_idx_task_id` (`task_id`);
ALTER TABLE `es_temp7` ADD INDEX `es_temp7_idx_task_id` (`task_id`);
ALTER TABLE `es_temp8` ADD INDEX `es_temp8_idx_task_id` (`task_id`);
ALTER TABLE `es_temp9` ADD INDEX `es_temp9_idx_task_id` (`task_id`);
ALTER TABLE `staff_jobs` ADD INDEX `staff_jobs_idx_task_id` (`task_id`);
ALTER TABLE `tasks` ADD INDEX `tasks_idx_id` (`id`);
The optimized query:
SELECT
        Waiting.w_waiting,
        Active.w_accept,
        Cancel.w_cancel,
        Notwork.w_notwork,
        Inwork.w_inwork,
        Precheck.w_precheck,
        Task.id,
        Task.case_id,
        Task.customer_id,
        Task.created,
        Task.interpreter_id,
        Task.high_light,
        Task.is_test,
        Task.redo,
        Task.deliveryProduction,
        Task.accept_assign,
        Task.qc_checking_id,
        Task.interpreter_id,
        Task.check_interpreter,
        Task.jobTitle,
        Task.amount,
        Task.isExpress,
        Task.is_ready,
        Task.status,
        Task.vip_job,
        Task.is_final_assigned,
        Task.sub_status,
        Task.jobInfo,
        Task.jobInfoProduction,
        Task.jobInfo_trans,
        Task.jobInfoProduction_trans,
        Task.customer_id,
        Qc_waitcheck.waitcheck,
        Qc_done.qc_done,
        Qc_ready.qc_ready,
        Qc_redo.qc_redo,
        Qc_redo_done.qc_redo_done,
        W_inwork.inwork,
        Task.customer_workflow_id,
        Task.workflow_activated,
        Task.superqc,
        Task.is_temp_stop,
        COALESCE(Upload_New,
        0) AS Upload_New,
        COALESCE(Upload_Int,
        0) AS Upload_Int,
        COALESCE(Upload_Ext,
        0) AS Upload_Ext,
        COALESCE(Upload_All,
        0) AS Upload_All,
        COALESCE(Accepted_Files,
        0) AS Accepted_Files,
        COALESCE(Check_Int,
        0) AS Check_Int,
        COALESCE(Check_Ext,
        0) AS Check_Ext,
        COALESCE(All_Files,
        0) AS All_Files 
    FROM
        tasks AS Task 
    LEFT JOIN
        staff_jobs AS SJ 
            ON SJ.task_id = Task.id 
    LEFT JOIN
        es_temp1 AS Waiting 
            ON Waiting.task_id = Task.id 
    LEFT JOIN
        es_temp2 AS Active 
            ON Active.task_id = Task.id 
    LEFT JOIN
        es_temp3 AS Cancel 
            ON Cancel.task_id = Task.id 
    LEFT JOIN
        es_temp4 AS Notwork 
            ON Notwork.task_id = Task.id 
    LEFT JOIN
        es_temp5 AS Inwork 
            ON Inwork.task_id = Task.id 
    LEFT JOIN
        es_temp6 AS Precheck 
            ON Precheck.task_id = Task.id 
    LEFT JOIN
        es_temp7 AS W_inwork 
            ON W_inwork.task_id = Task.id 
    LEFT JOIN
        es_temp8 AS Qc_waitcheck 
            ON Qc_waitcheck.task_id = Task.id 
    LEFT JOIN
        es_temp9 AS Qc_done 
            ON Qc_done.task_id = Task.id 
    LEFT JOIN
        es_temp10 AS Qc_ready 
            ON Qc_ready.task_id = Task.id 
    LEFT JOIN
        es_temp11 AS Qc_redo 
            ON Qc_redo.task_id = Task.id 
    LEFT JOIN
        es_temp12 AS Qc_redo_done 
            ON Qc_redo_done.task_id = Task.id 
    LEFT JOIN
        es_temp13 AS Upload_New 
            ON Upload_New.task_id = Task.id 
    LEFT JOIN
        es_temp14 AS Upload_Int 
            ON Upload_Int.task_id = Task.id 
    LEFT JOIN
        es_temp15 AS Upload_Ext 
            ON Upload_Ext.task_id = Task.id 
    LEFT JOIN
        es_temp16 AS Upload_All 
            ON Upload_All.task_id = Task.id 
    LEFT JOIN
        es_temp17 AS CHECKING 
            ON CHECKING.task_id = Task.id 
    LEFT JOIN
        es_temp18 AS INTERNAL 
            ON INTERNAL.task_id = Task.id 
    LEFT JOIN
        es_temp19 AS EXTERNAL 
            ON EXTERNAL.task_id = Task.id 
    LEFT JOIN
        es_temp20 AS DONE_ALL 
            ON DONE_ALL.task_id = Task.id 
    GROUP BY
        Task.id 
    ORDER BY
        NULL

Related Articles



* original question posted on StackOverflow here.