那张table叫 TB_ORDER
有9000万条数据记录,但只有500条状态既不是b也不是c的记录。
SELECT
ORDER.ID,ORDER.STATE,ORDER.NAME
FROM
TB_ORDER ORDER
WHERE
ORDER.STATE NOT IN ('B','C') ;
我的同事这样写sql,因为 full table scan
。所以我试着这样修改它。可以吗?我在状态字段上添加了索引。它还在吗 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'
)
2条答案
按热度按时间pprl5pva1#
你真的需要那个不在里面的人吗?您可以通过使用函数然后创建基于函数的索引来解决这个问题。确保where子句与 predicate 完全匹配。例子:
wko9yo5t2#
我给你提个建议,你可以试试。