我只是在我的MySQL数据库中开始使用INDEXes而且我有点不确定我的想法是否会起作用。我有一个TEXT字段,可以存储大量文本,需要搜索,以及另一个ID INT字段。如果我在我的text_column上有一个INDEX表示我的id_column字段和一个FULLTEXT索引,那么MySQL是否会在查询中使用它们,例如
SELECT * FROM notes WHERE id_column='123' AND MATCH(text_column) AGAINST(search_text)
...
其次,我有一组可以经常用于组合搜索的列。如果我在这些列中创建一个多列INDEX,如果所使用的列在索引中从左到右在一起,则索引将一直工作。但是如果用户遗漏了一个特定的列,比如B,并且使用A,B,D在像(A,B,C,D)这样的索引中搜索,会发生什么呢?
答案 0 :(得分:0)
问题1:
是的,查询将使用两个索引。但是,FULLTEXT
索引可能有点棘手,因此最好彻底阅读MySQL文档并在查询中使用EXPLAIN
以确保它们正确使用索引。
问题2:
如果您有多列索引,则索引必须具有与要使用的查询相同顺序的相同列。因此,在您的示例中,不会使用索引。
EXPLAIN
是一个非常强大的工具,用于理解查询如何使用索引,并且经常使用它(特别是对以编程方式生成的查询)。 http://dev.mysql.com/doc/refman/5.0/en/explain.html
答案 1 :(得分:0)
无法保证MySQL会在一个查询中对同一个表使用两个索引。一般来说,没有。但有时它会激活“索引合并”,搜索两个索引并合并结果。
然而,并非所有查询都可以执行此操作。您应该在此处阅读此功能:http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html
关于多列索引,如果列A,B,C,D上有索引,并且对列A,B,D进行搜索,则可以使用索引,但只能使用索引。根据您对A列和B列的条件缩小搜索范围。
如果您使用EXPLAIN并查看“ken_len”字段,则可以看到此证据。 key_len将是该多列索引中使用的列中的总字节数。例如,如果A,B,C,D是四个4字节整数,则key_len可能多达16个。但如果只使用A和B,则key_len将为8。
答案 2 :(得分:0)
鉴于此查询:
SELECT * FROM notes
WHERE id_column='123'
AND MATCH(text_column) AGAINST(search_text)
优化器执行它的唯一方法(据我所知)是
FULLTEXT(text_column)
执行搜索的第二部分,然后 id_column='123'
的人;此步骤不会使用任何索引。混合FULLTEXT
和非全文索引时的一般规则 - 首先是FULLTEXT;没有使用其他索引。
然而......这是一个有时加速复杂查询的技巧:
SELECT b.*
FROM (
SELECT id -- assuming this is the PRIMARY KEY
FROM notes
WHERE MATCH(text_column) AGAINST(search_text)
) AS a
JOIN notes AS b -- "self join"
ON b.id = a.id -- just the PK
JOIN ((other tables)) ON ...
WHERE ((other messy or bulky stuff)) ...
我们的想法是使用子查询缩减为一个小值列表(ids),然后返回(或进一步加入)以获得笨重的东西。
要为某些简单查询构建最佳复合索引,请参阅my index cookbook。