2012-09-11 62 views
2

如果條件出現在我的查詢的where子句中,我有這種情況。所有字段都有它自己的indexes,它們在if中使用。但是查詢完成table掃描。 任何人都可以幫助我避免全表掃描?全表掃描,同時在查詢中使用if條件

我的查詢:

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) 
+1

顯示查詢請。 – hims056

+0

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

回答

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) 

你如果是沒有SENCE。它所做的是:

  • 如果BILL_TYPE = 'OP',
  • 和BILL_CATEGORY = 0,
  • 然後在WHERE子句時DUE_AMOUNT = 0
  • 否則where子句是真實的永遠是真的。

但無論如何,你不需要它。您可以改寫這樣的查詢,使用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)一個指標,但即使這樣,與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 
+0

感謝烏拉圭回合的答覆。在這裏,我檢查DUE_AMOUNT!= 0 ,而fetchInfo.BILL_TYPE ='OP'AND fetchInfo.BILL_CATEGORY = 0其他方式不需要,但是你的查詢只返回所有三個匹配的行。 –

+0

等一下。如果BILL_CATEGORY!= 0,那麼你是否希望該行可以計數?因爲在這種情況下,您當前的IF將返回TRUE(使行數)。 – Konerak

+0

BILL_CATEGORY!= 0表示它返回true,所以我想數。我得到了我的結果,但想要最小化掃描。 –