MYSQL OR查询问题即使使用索引也会扫描整个表

问题描述

我正在使用EXPLAIN对以下查询进行性能分析:

SELECT `wf_cart_items` . `id`
FROM `wf_cart_items`
WHERE (`wf_cart_items` . `docket_number` = '405-2844' OR
       match( `wf_cart_items` . `multi_docket_number` ) against ( '405-2844' )
      )

enter image description here

问题在于,它显示了要搜索的行597151,而各个OR查询仅检查了每一行。当我使用OR时,怎么可能会进行全表扫描?

d

enter image description here

P.S .:我在multi_docket_number上具有全文索引,而在docket_number上具有BTREE索引

解决方法

OR对于SQL优化器来说非常棘手-在WHERE子句和ON子句中都是如此。

建议将其切换为union all

SELECT ci.id
FROM wf_cart_items ci
WHERE ci.docket_number = '405-2844' 
UNION ALL
SELECT ci.id
FROM wf_cart_items ci
WHERE MATCH(ci.multi_docket_number) AGAINST ( '405-2844' ) AND
      ci.docket_number <> '405-2844';

根据您的列命名,我认为multi-docket_number实际上包含多个文案号。如果是这样,您可能要修复数据模型,但这是另一回事。