MySQL - 全文搜索 - 丢失索引

时间:2013-05-21 17:12:41

标签: php mysql indexing full-text-search

所以这是场景:

  • MySQL的
  • 有1个MYISAM表
  • colum named 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上)。 我运行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))


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

1 个答案:

答案 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;

试一试!!!