gpt4 book ai didi

mysql - 在查询中使用 if 条件时进行全表扫描

转载 作者:搜寻专家 更新时间:2023-10-30 20:42:52 28 4
gpt4 key购买 nike

我遇到了在查询的 where 子句中使用 if 条件的情况。所有字段都有自己的 indexes 用于 if.但是查询进行了完整的 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)

最佳答案

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 子句为真
  • 否则 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

关于mysql - 在查询中使用 if 条件时进行全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12366597/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com