2017-08-23 3 views
-1

私は以下のmysqlクエリを使って、各請求書の総額と税額を取得します。実行に約10分かかるMysqlクエリ

SELECT b.bill_no 
    , b.total_amount 
    , b.created_at 
    , b.id 
    , (SELECT sum(gst_amt) 
     FROM bill_contents_pharmacy bc 
     WHERE bc.bill_id = b.id) as tgst 
    FROM bills b 
WHERE b.bill_type = 'pharmacy' 
    AND cast(b.cr_at as date) >= '2017-08-01' 
    AND cast(b.cr_at as date) <= '2017-08-23' 
    AND b.is_cancelled = 0 
    AND b.is_deleted = 0 
ORDER 
    BY b.bill_no ASC 

このクエリは、私のPHPコード内で約10分を取っているが、私はphpMyAdminの中でそれを実行すると、それはちょうど3.6秒で完了です。私は間違って何をしていますか?

+0

ほとんどの場合、あなたが同じデータベースとまったく同じクエリを実行するかしていないがスピードアップしなければなりません。 –

+0

あなたがPHPコードを投稿しない限り、どうすればわかるのですか? – rtfm

+0

3.6秒もかなりです。いくつのレコードを扱っていますか? –

答えて

0

これを試すこともできます。請求書とbill_contents_pharmacyテーブルにリレーションシップを作成してインデックスを作成する必要があります。

SELECT b.bill_no, b.total_amount, b.created_at, b.id, sum(bc.gst_amt) as tgst 
FROM bills b 
JOIN bill_contents_pharmacy bc ON bc.bill_id = b.id 
WHERE b.bill_type = 'pharmacy' 
AND cast(b.cr_at as date) >= '2017-08-01' 
AND cast(b.cr_at as date) <= '2017-08-23' 
AND b.is_cancelled = 0 
AND b.is_deleted = 0 
GROUP BY b.bill_no, b.total_amount, b.created_at, b.id 
ORDER BY b.bill_no ASC 

これはあなたのクエリ

+0

あなたは歓迎ですNadalAbad –

0

問題はそのサブクエリのようです。代わりに結合を使用してみてください。

SELECT b.bill_no, b.total_amount,b.created_at, b.id, sum(bc.gst_amt) as tgst 
FROM bills b LEFT JOIN bill_contents_pharmacy bc ON (bc.bill_id = b.id) 
WHERE b.bill_type = 'pharmacy' AND cast(b.cr_at as date) >= '2017-08-01' 
AND cast(b.cr_at as date) <= '2017-08-23' 
AND b.is_cancelled IS FALSE AND b.is_deleted IS FALSE 
GROUP BY b.bill_no, b.total_amount, b.created_at, b.id 
ORDER BY b.bill_no ASC 

また、現在までのキャストは必要ない場合があります。

+0

これは説明していません "このクエリはPHPコード内で約10分かかりますが、 phpmyadminではわずか3.6秒で完了しました。 – rtfm

+0

実際にそれは – dExIT

関連する問題