所以这是场景:
基本查询工作正常,按预期使用索引:
SELECT p.online_identifier
FROM (...)
WHERE r.area_id = 3 AND s.state_id= 4
AND (snap.area_has_catalogues_attributes_id = 7028
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))
现在,当我添加OR时,不使用全文搜索索引(在v.value上)。 我运行Explain来验证它。
查询看起来像这样:
(...)
WHERE r.area_id = 3 AND s.state_id= 4 AND
(snap.area_has_catalogues_attributes_id = 7028 AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))
OR (snap.area_has_catalogues_attributes_id = 7045 AND MATCH (v.value) AGAINST('+OtherBrand' IN BOOLEAN MODE))
我不明白为什么。 有什么想法吗?
答案 0 :(得分:0)
以下是一些有趣的内容:您所拥有的查询实际上会导致忽略FULLTEXT索引。别担心,这不是你的错。我之前写过:Is there a way to hint to query optimizer to MySQL which constraints should be done first?
在查看我的答案及其后续链接后,现在让我们看看您的原始查询:
SELECT p.online_identifier
FROM (...)
WHERE r.area_id = 3 AND s.state_id= 4
AND (snap.area_has_catalogues_attributes_id = 7028
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE))
您必须单独执行FULLTEXT搜索并仅检索ID。
使用这些ID加入其他表别名。
让我从my other links之一进行查询,以演示如何处理查询
而不是此查询
select * from seeds WHERE MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE) = 4;
你必须将它重构成这样的东西:
SELECT B.* FROM
(
SELECT id,MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE) score
FROM seeds
WHERE MATCH(text) AGAINST
("mount cameroon" IN BOOLEAN MODE)
) A
INNER JOIN seeds B USING (id)
WHERE A.score = 4;
试一试!!!