0

所以这里是场景:

  • MySQL
  • 有 1 个 MISAM 表
  • 名为 v.value 的列具有全文索引

基本查询工作正常,按预期使用索引:

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 上)。我运行解释来验证它。

查询看起来像这样:

(...) 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))


我不明白为什么。有任何想法吗?

4

1 回答 1

0

这是一些有趣的事情:您的查询实际上导致 FULLTEXT 索引被忽略。别担心,这不是你的错。我之前写过这个:有没有办法提示查询优化器到 MySQL 应该首先完成哪些约束?

查看我的答案及其后续链接后,现在让我们看看您的原始查询:

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 连接到其他表别名。


让我从我的其他链接之一中进行查询,以演示如何处理您的查询

而不是这个查询

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;

试试看 !!!

于 2013-05-21T19:29:30.167 回答