问题描述
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' )
)
问题在于,它显示了要搜索的行597151,而各个OR查询仅检查了每一行。当我使用OR时,怎么可能会进行全表扫描?
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
实际上包含多个文案号。如果是这样,您可能要修复数据模型,但这是另一回事。