全文和复合索引以及它们如何影响查询

时间:2012-09-14 15:02:49

标签: mysql indexing full-text-search

只是说我有一个查询如下..

SELECT 
    name,category,address,city,state
FROM
    table
WHERE 
    MATCH(name,subcategory,category,tag1) AGAINST('education')
AND 
    city='Oakland'
AND
    state='CA' 
LIMIT
    0, 10;

..我的fulltext索引为name,subcategory,category,tag1composite索引为city,state;这个查询足够好吗?只是想知道在使用带有MATCH / AGAINST的全文索引时混合其他AND时是否需要额外的东西。

编辑:我想要了解的是,查询中的其他列会发生什么,但未在所选索引(全文索引)中编入索引,上面的示例为{ {1}}和city。 MySQL现在如何找到匹配的行,因为它不能使用两个索引(或者它可以吗?) - 所以,基本上,我试图理解MySQL如何最佳地找到数据 对于不在所选全文索引中的列,如果有任何我可以 做的事情来优化查询。

2 个答案:

答案 0 :(得分:1)

我认为您可以在查询中使用EXPLAIN轻松确定使用哪个索引。请检查this question的已接受答案,该答案提供了一些有关如何解释EXPLAIN输出的良好资源。

  

MySQL如何找到匹配的行,因为它无法使用   两个指标

是的,它可以:Can MySQL use multiple indexes for a single query?另外,您应该阅读文档:How MySQL Uses Indexes

答案 1 :(得分:1)

前段时间我有类似的任务,我注意到MySQL可以在一个查询中使用FULLTEXT索引或任何其他索引/索引,但不能同时使用两者;我无法将FULLTEXT与任何其他索引混合使用。使用全文搜索的任何选择都将以这种方式工作:

  • 使用FULLTEXT搜索选择子集
  • 选择与该子集“使用何处”
  • 中的其他条件匹配的记录

所以你可以使用全文索引或任何其他索引(我无法通过FORCE INDEX或其他任何东西使用这两个索引)。

我建议尝试使用全文并使用其他索引(即在城市和州列上)并比较结果 - 它们可能会因数据库中的实际内容而异。

在我的情况下,我发现在这种查询中强制常规(非全文)索引产生了更好的性能(因为我有非常多的行,大约300 000,非全文标准匹配大约1000个)。

我使用的是MySQL 5.5.24