查询优化技术

时间:2020-02-26 13:19:50

标签: mysql view query-optimization mysql-workbench

我有很多这样的查询,当我如下运行它们时,它们运行很快。但是,如果我将它们保存到视图中然后运行它们,它们将超时。关于如何优化这样的查询或更快地缩短回退时间的任何想法?最终的结果是让Microsoft Power BI将其删除。

    SELECT 
        `mbol`.`Id` AS `Id`,
        (SELECT 
                `sp_price_sheet`.`NormalizedTotalValue`
            FROM
                ((`mbol` `sp_mbol`
                LEFT JOIN `mbol_price_sheet_xref` `sp_price_sheet_xref` ON ((`sp_mbol`.`Id` = `sp_price_sheet_xref`.`MbolId`)))
                LEFT JOIN `price_sheet` `sp_price_sheet` ON ((`sp_price_sheet_xref`.`PriceSheetId` = `sp_price_sheet`.`Id`)))
            WHERE
                ((`sp_mbol`.`Id` = `mbol`.`Id`)
                    AND (`sp_price_sheet`.`Type` = 'Charge')
                    AND (`sp_price_sheet`.`IsSelected` = '1'))
            ORDER BY `sp_price_sheet`.`UpdateDate` DESC
            LIMIT 1) AS `Actual Carrier Rate`,

            FROM
                ((((`mbol` `psc_mbol`
                LEFT JOIN `mbol_price_sheet_xref` `psc_xref` ON ((`psc_mbol`.`Id` = `psc_xref`.`MbolId`)))
                LEFT JOIN `price_sheet` `psc_price_sheet` ON ((`psc_xref`.`PriceSheetId` = `psc_price_sheet`.`Id`)))
                LEFT JOIN `settlement` `psc_settle` ON ((`psc_price_sheet`.`Id` = `psc_settle`.`PriceSheetId`)))
                LEFT JOIN `check` ON ((`psc_settle`.`CheckId` = `check`.`Id`)))
            WHERE
                ((`psc_mbol`.`Id` = `mbol`.`Id`)
                    AND (`psc_price_sheet`.`Type` = 'Billed'))) AS `Check Date`,
        (SELECT 
                `packnum4_reference`.`Value`
            FROM
                ((`mbol` `packnum4_mbol`
                LEFT JOIN `mbol_reference_xref` `packnum4_xref` ON ((`packnum4_mbol`.`Id` = `packnum4_xref`.`MbolId`)))
                LEFT JOIN `reference` `packnum4_reference` ON ((`packnum4_xref`.`ReferenceId` = `packnum4_reference`.`Id`)))
            WHERE
                ((`packnum4_mbol`.`Id` = `mbol`.`Id`)
                    AND (`packnum4_reference`.`Type` = 'Route Board Id'))
            ORDER BY `packnum4_xref`.`InsertDate` DESC
            LIMIT 1) AS `Route Board Id`,
        (SELECT 
                MAX(`act`.`CompletedDate`)
            FROM
                ((`mbol` `mbolact`
                LEFT JOIN `mbol_activity_xref` `mbolxact` ON ((`mbolact`.`Id` = `mbolxact`.`MbolId`)))
                LEFT JOIN `activity` `act` ON ((`mbolxact`.`ActivityId` = `act`.`Id`)))
            WHERE
                ((`act`.`Type` = 'Issue Log Acct Operations')
                    AND (`mbolact`.`Id` = `mbol`.`Id`))) AS `Issue Log Acct Completed`,
        (SELECT 
                MAX(`act`.`CompletedDate`)
            FROM
                ((`mbol` `mbolact`
                LEFT JOIN `mbol_activity_xref` `mbolxact` ON ((`mbolact`.`Id` = `mbolxact`.`MbolId`)))
                LEFT JOIN `activity` `act` ON ((`mbolxact`.`ActivityId` = `act`.`Id`)))
            WHERE
                ((`act`.`Type` = 'Add Customer Invoice')
                    AND (`mbolact`.`Id` = `mbol`.`Id`))) AS `Invoice Date`

    FROM
        ((((`price_sheet` `psc_price_sheet`
        LEFT JOIN `settlement` ON ((`psc_price_sheet`.`Id` = `settlement`.`PriceSheetId`)))
        LEFT JOIN `check` ON ((`settlement`.`CheckId` = `check`.`Id`)))
        LEFT JOIN `mbol_price_sheet_xref` `psc_xref` ON ((`psc_price_sheet`.`Id` = `psc_xref`.`PriceSheetId`)))
        LEFT JOIN `mbol` ON ((`psc_xref`.`MbolId` = `mbol`.`Id`)))
    WHERE
        ((`mbol`.`Type` = 'Regular')
            AND (`mbol`.`status` = 'Delivered'))
    GROUP BY `mbol`.`Id`

1 个答案:

答案 0 :(得分:0)

请考虑使用Option Connections of Nodes: A:[B1, B2, C] B:[C, D] C:[D] Start at A:(and add to array) Loop through each possibility: (add to second element of array) loop through each possibility of A's possibility: (add to third element of array) ... after reaching D, save array and create next array. (而不是视图)编写一个STORED PROCEDURE。然后SELECT

同时,其中一些索引可能会有所帮助:

CALL