对于未付费发票搜索,Mysql查询速度太慢

时间:2017-05-24 11:11:54

标签: mysql sql mysqli

所以我有一个包含大约80 000张发票的数据库,每张发票都有一张表中列出的发票项目,其中包含价格,增值税和折扣以及发票ID。我还有一张收据表,其中包含已支付的价格和发票ID。

我需要找出哪些发票没有全部付清。 到目前为止我所拥有的是:

SELECT SUM((i.price-(i.price*(i.discount/100)) + (i.price-(i.price*(i.discount/100))*(tax/100)))*i.quantity) invoiced
     , invoice_id invoiceitems
     , ( SELECT SUM(payed_value) 
           FROM receipts 
          WHERE invoice_id = invoiceitems 
            AND payed_value IS NOT NULL
       ) paid 
    FROM invoices_items i
   WHERE invoice_id IN (SELECT id 
                          FROM invoices x 
                         WHERE x.invoicing_date < 1493503200
                       ) 
   GROUP 
      BY i.invoice_id 
   HAVING paid < invoiced;

问题是此查询需要3分钟才能执行。

我需要的是一张桌子,其中包含所有已开票的价格和支付的价格,每张发票一行。我需要它比3分钟跑得快。

编辑:所以,如果我按部分删除该组,它突然只需要0.17秒,但只给我一行。有什么我可以做而不是得到相同的结果?

1 个答案:

答案 0 :(得分:0)

很难检查这个,但尝试用

替换where
FROM invoices_items ii
    join invoices inv on ii.invoice_id = inv.id
    WHERE inv.invoicing_date < 1493503200

使用带有子选择的where in会导致性能问题,在这种情况下,简单连接应该生成相同的值。

编辑: SQL 的主要重构可能工作

SELECT SUM((i.price-(i.price*(i.discount/100)) + (i.price-(i.price*(i.discount/100))*(tax/100)))*i.quantity) invoiced
     , invoice_id
     , SUM(coalesce(p.payed_value,0)) paid 
    FROM invoices_items i
        join invoices inv on i.invoice_id = inv.id
        left join receipts rec on rec.invoice_id = i.invoice_id
   WHERE inv.invoicing_date < 1493503200
   GROUP 
      BY i.invoice_id 
   HAVING paid < invoiced;