MYSQL 或查询问题(即使在使用索引时也会扫描完整 table)
MYSQL OR query problem (scans full table even when using indexes)
我正在使用 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' )
)
问题是它显示要搜索的行 597151,而单个 OR 查询每个只检查 1 行。当我使用 OR 时,它怎么可能进行完整的 table 扫描?
P.S.: 我在 multi_docket_number 上有 FULL-TEXT 索引,在 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
实际上包含多个摘要编号。如果是这种情况,您可能想要修复数据模型,但那是另一回事了。
我正在使用 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' )
)
问题是它显示要搜索的行 597151,而单个 OR 查询每个只检查 1 行。当我使用 OR 时,它怎么可能进行完整的 table 扫描?
P.S.: 我在 multi_docket_number 上有 FULL-TEXT 索引,在 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
实际上包含多个摘要编号。如果是这种情况,您可能想要修复数据模型,但那是另一回事了。