suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So verwalten Sie langsame MySQL-Abfragen beim Vergleich zweier Tabellen in einer Master-Detail-Beziehung: Eine Schritt-für-Schritt-Anleitung

Bitte hilf mir.. Ich habe eine Anfrage wie die folgende: Hier ist eine Tabelle:

  1. delivery_order
  2. delivery_order_item
  3. bst
  4. bst_item

Ich möchte Artikel anzeigen, die in der Tabelle „delivery_order/item“, aber nicht in der Tabelle „bst/item“ vorhanden sind, und zwar anhand von KODE_BARANG und JUMLAH.

Ich habe die folgende Abfrageanweisung, aber sie ist immer noch sehr langsam, wenn bereits viele Daten vorhanden sind (der langsame Teil ist der Vergleich der Zeilen von KODE_BARANG). Ich würde gerne fragen, ob einer meiner Freunde eine ähnliche Situation hat und wie ich sie lösen kann. Vielen Dank im Voraus, ich hoffe, hier ist jemand bereit zu antworten.

SELECT
    del.KODE_DO,
    deli.KODE_BARANG,
    deli.NAMA_BARANG,
    deli.JUMLAH,
    deli.SATUAN,
    @DITERIMA := COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) AS DITERIMA,
    COALESCE ( deli.JUMLAH, 0 ) - @DITERIMA AS SISA
FROM
    delivery_order del
    INNER JOIN delivery_order_item deli ON del.KODE_DO = deli.KODE_DO
WHERE
    DATE(del.TANGGAL) >= :TGL1
    AND DATE(del.TANGGAL) <= :TGL2  
    AND COALESCE ( deli.JUMLAH, 0 ) - COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) > 0
SELECT
    del.KODE_DO,
    deli.KODE_BARANG,
    deli.NAMA_BARANG,
    deli.JUMLAH,
    deli.SATUAN,
    @DITERIMA := COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) AS DITERIMA,
    COALESCE ( deli.JUMLAH, 0 ) - @DITERIMA AS SISA
FROM
    delivery_order del
    INNER JOIN delivery_order_item deli ON del.KODE_DO = deli.KODE_DO
WHERE
    DATE(del.TANGGAL) >= :TGL1
    AND DATE(del.TANGGAL) <= :TGL2  
    AND COALESCE ( deli.JUMLAH, 0 ) - COALESCE ((
        SELECT
            SUM( JUMLAH ) 
        FROM
            bst_item 
        WHERE
            KODE_PENERIMAAN = deli.KODE_DO
            AND KODE_BARANG = deli.KODE_BARANG  #这行使它变慢
            AND `STATUS` <> 0),0) > 0

P粉724256860P粉724256860480 Tage vor499

Antworte allen(1)Ich werde antworten

  • P粉652523980

    P粉6525239802023-09-14 14:59:16

    INDEX(KODE_PENERIMAAN, KODE_BARANG, `STATUS`)

    而且不要在函数调用中隐藏TANGGAL。 (cf "sargable")

    Antwort
    0
  • StornierenAntwort