2016-11-25 101 views
1

如标题所示,您如何知道查询是否使用FTS索引?MySQL - 如何知道查询是否使用FTS索引

通常它显示using index condition

我的查询语句:

SELECT * 
FROM news 
WHERE MATCH(news_title,news_keywords) AGAINST ('news') 
AND news_date_created BETWEEN '2016-01-01' AND '2016-12-31' 

和执行EXPLAIN,给了我:

+----+-------------+-------+------------+----------+--------------------------+------------+---------+-------+------+----------+-------------------------------+ 
| id | select_type | table | partitions | type  | possible_keys   | key  | key_len | ref | rows | filtered | Extra       | 
+----+-------------+-------+------------+----------+--------------------------+------------+---------+-------+------+----------+-------------------------------+ 
| 1 | SIMPLE  | news | NULL  | fulltext | news_date_idx,news_title | news_title |  0 | const | 1 | 100.00 | Using where; Ft_hints: sorted | 
+----+-------------+-------+------------+----------+--------------------------+------------+---------+-------+------+----------+-------------------------------+ 

如果它使用索引或没有我不知道。它只是说它使用where and ft_hints

+0

据我所知,如果您使用'MATCH ... AGAINST'并且没有合适的索引,它只会引发错误。与常规查询不同,这不是可以在没有索引的情况下获得的数据。 –

+0

@ÁlvaroGonzález不,这不完全正确。 – Shadow

+0

@Shadow我会很欣赏这方面的一个例子。 MySQL可以搜索“公共房屋”并找到带有FT索引的“普通房屋”吗? –

回答

3

答案出现在解释结果的key列中,列出使用的索引。在这个特殊情况下,使用了news_title索引。如果这是你的全文索引,那么它就被使用了。

此外,请注意,从fulltext search in Boolean mode on myiasm tables,除了所有的搜索需要匹配的全文索引存在:

的MATCH()列列表必须与列的列表中一些FULLTEXT索引定义匹配表,除非这个MATCH()在MyISAM表中是BOOLEAN MODE。对于MyISAM表,布尔模式搜索可以在非索引列上完成,尽管它们可能很慢。

+0

感谢您的答复我的答案。是的,我想你是对的,因为你有什么说的都差不多在此链接上:[链接](https://www.percona.com/live/europe-amsterdam-2015/sites/default/files/slides/Query%20Optimization%3A%20From%200%20to%2010%20(和%20up%20to%205.7).pdf) –