2

whereクエリの句でif条件を使用する状況があります。indexesifで使用される独自のフィールドを持つすべてのフィールド。しかし、フルtableスキャンを行うクエリ。フルテーブルスキャンを回避するのに役立つ人はいますか?

私のクエリ:

EXPLAIN SELECT COUNT(*) 
FROM BILL_PATIENT_BILL AS fetchInfo 
WHERE IF(fetchInfo.BILL_TYPE='OP' 
AND fetchInfo.BILL_CATEGORY=0,fetchInfo.DUE_AMOUNT != 0,TRUE)
4

1 に答える 1

1
EXPLAIN SELECT COUNT(*) 
FROM BILL_PATIENT_BILL AS fetchInfo 
WHERE IF(fetchInfo.BILL_TYPE='OP' 
AND fetchInfo.BILL_CATEGORY=0,fetchInfo.DUE_AMOUNT != 0,TRUE)

あなたのIFは意味がありません。それがすることは次のとおりです。

  • BILL_TYPE='OP' の場合、
  • および BILL_CATEGORY=0、
  • DUE_AMOUNT != 0 の場合、where 節は true になります。
  • それ以外の場合、where 句は常に true です。

とにかく、あなたはそれを必要としません。De Morganを使用して、このようにクエリを書き直すことができます

EXPLAIN SELECT COUNT(*) 
FROM BILL_PATIENT_BILL AS fetchInfo 
WHERE (fetchInfo.BILL_TYPE='OP' 
  AND fetchInfo.BILL_CATEGORY=0 
  AND fetchInfo.DUE_AMOUNT != 0)
  OR fetchInfo.BILL_TYPE<>'OP'
  OR fetchInfo.BILL_CATEGORY=0

(BILL_TYPE,BILL_CATEGORY,DUE_AMOUNT) に 1 つのインデックスを設定する必要がありますが、それでも OR 句を使用すると、インデックスを使用しないと判断される場合があります。その場合は、共用体として書き直してみてください。

SELECT COUNT(*) 
    FROM BILL_PATIENT_BILL AS fetchInfo 
    WHERE (fetchInfo.BILL_TYPE='OP' 
      AND fetchInfo.BILL_CATEGORY=0 
      AND fetchInfo.DUE_AMOUNT != 0)
UNION ALL
SELECT COUNT(*)
    FROM BILL_PATIENT_BILL AS fetchInfo 
      WHERE fetchInfo.BILL_TYPE<>'OP'
UNION ALL
SELECT COUNT(*)
    FROM BILL_PATIENT_BILL AS fetchInfo 
      WHERE fetchInfo.BILL_CATEGORY=0

それらを追加するためにSUMを実行できます。

実際には列のすべての値を受け入れているので、where句さえ必要ないかもしれません...

EXPLAIN SELECT COUNT(
  IF(fetchInfo.BILL_TYPE='OP' 
    AND fetchInfo.BILL_CATEGORY=0 
    AND fetchInfo.DUE_AMOUNT != 0,
  1,
  0)) 
FROM BILL_PATIENT_BILL AS fetchInfo 
于 2012-09-11T09:32:02.993 に答える