Mysql子查询也使用索引吗?

时间:2013-11-16 05:05:09

标签: mysql indexing

我有一张表,我在全文搜索。它已经开始变得很大,只有相对少量的用户 - 2000万行

搜索只需要在属于与搜索相关的PK的行上,即属于该用户的行,并且最多,每个用户约为200 000。我想如果全文搜索只是在首先选择该用户的行的子查询上完成,它应该超级快,例如

SELECT * FROM 
(SELECT * FROM table1 WHERE userID = 2 ) AS r 
WHERE MATCH (r.fullTextCol1) AGAINST ('+monkey* ' IN BOOLEAN MODE)
ORDER BY r.fullTextCol1, r.fullTextCol2 ASC LIMIT 0,50

但是,此查询需要4秒钟。

EXPLAIN说......

1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    185927  Using where; Using filesort
2   DERIVED     table1      ref     PRIMARY,unique  unique  4       193082  

我的索引是:

PRIMARY (userID, userSubList, userItemID)
FULLTEXT fullTextCol1
FULLTEXT fullTextCol2

子查询似乎根本不使用userID索引。

我的想法是否正确地接近它 - 选择要搜索的相关用户行?

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

你试过这样的尝试吗? :

SELECT *
FROM table1
WHERE userID = 2
  AND MATCH (fullTextCol1) AGAINST ('+monkey* ' IN BOOLEAN MODE)
ORDER BY fullTextCol1, fullTextCol2 ASC LIMIT 0,50;

或者在没有ORDER BY的情况下运行以检查JOIN是否缓慢或ORDER缓慢(或混合)

修改

在您的情况下,需要(userID, fullTextCol1)上的复合索引,但MySQL没有。另一个已经回答了这个。见Compound FULLTEXT index in MySQL

请告诉我,上面的答案是有道理的,也是结果。