如何在mysql的select子句中优化子查询?

时间:2015-10-21 11:55:45

标签: mysql

我在select子句中有一个子查询,就像这个

SELECT
`s`.`id`              AS `id`,
`s`.`unit_id`         AS `unit_id`,
`m`.`description`     AS `description`,
`s`.`lot_no`          AS `lot_no`,
(
   (  
      (
         SELECT COALESCE(SUM(`payment_amt`),0) AS `jmlh`
         FROM `sb_ar_bill_sch`
         WHERE `unit_id` = `s`.`unit_id` AND `lot_no` = `s`.`lot_no` AND `project_no` = `s`.`project_no` AND `debtor_acct` = `s`.`debtor_acct` 
         AND `bill_type` = 'S'  
      )
      / 
      `s`.`sell_price`
   ) 
   * 
   100
) AS `persen_paid`
FROM `p_sis_rl_sales` `s`
JOIN `p_sis_pl_project` `p` ON `s`.`unit_id` = `p`.`unit_id` AND `s`.`project_no` = `p`.`project_no`
JOIN `p_sis_pm_lot` `l` ON `s`.`unit_id` = `l`.`unit_id` AND `s`.`project_no` = `l`.`project_no` AND `s`.`lot_no` = `l`.`lot_no`
JOIN `p_common_businessunit` `m` ON `s`.`unit_id` = `m`.`unit_id`
JOIN `v_la_lastowner` `o` ON `s`.`unit_id` = `o`.`unit_id` AND `s`.`project_no` = `o`.`project_no` AND `s`.`lot_no` = `o`.`lot_no`
WHERE 
(
   `s`.`contract_no` IS NOT NULL
   AND 
   (
      (  
    (
           SELECT COALESCE(SUM(`payment_amt`),0) AS `jmlh`
           FROM `sb_ar_bill_sch`
           WHERE `unit_id` = `s`.`unit_id` AND `lot_no` = `s`.`lot_no` AND `project_no` = `s`.`project_no` AND `debtor_acct` = `s`.`debtor_acct` 
           AND `bill_type` = 'S'    
    )
        / `s`.`sell_price`
      ) 
      * 
      100
   ) 
   >= 
   100
)
ORDER BY `s`.`sales_date` DESC

我已将我使用过的表编入索引。

我是否需要在一个表中处理数十万行?

上面的查询需要很长时间。如何优化上述查询?

0 个答案:

没有答案