我有一张表,我在全文搜索。它已经开始变得很大,只有相对少量的用户 - 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索引。
我的想法是否正确地接近它 - 选择要搜索的相关用户行?
感谢您的时间和帮助。
答案 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