称为TB_ORDER
的表具有9000万条数据记录,但仅具有500条状态,即STATE既不是B也不是C。
SELECT
ORDER.ID,ORDER.STATE,ORDER.NAME
FROM
TB_ORDER ORDER
WHERE
ORDER.STATE NOT IN ('B','C') ;
我的同事这样写sql,由于full table scan
,它的成本大约为7分钟。所以我尝试像这样更改它。可以吗?我在状态字段上添加了索引。是否仍然是full table scan
,因为子查询sql结果非常大((90000000-500)/ 90000000)?
SELECT
A.ID,A.NAME,A.STATE
FROM TB_ORDER A
WHERE
NOT EXISTS
(
SELECT 1 FROM TB_ORDER B WHERE A.ID=B.ID and B.STATE='B'
UNION ALL
SELECT 1 FROM TB_ORDER C WHERE A.ID=C.ID and C.STATE='C'
)