我有这张桌子:
bussId | nameEn | keywords
500 name1 name2 keyword1 keyword2
Run Code Online (Sandbox Code Playgroud)
如果用户搜索(keyword1或keyword2或name2或name1),我想返回bussId 5000.所以我应该使用这个查询SELECT * FROM business WHERE nameEn LIKE '%searched_word%'.但是index nameEn or keywords根据B-Tree和Hash Indexes的比较,这个查询不使用"如果参数to LIKE是一个不以通配符开头的常量字符串,那么索引也可以用于LIKE比较".
我有这个解决方案,我想创建另一个表并插入所有单个单词:
bussId | word
500 name1
500 name2
500 keyword1
500 keyword2
Run Code Online (Sandbox Code Playgroud)
然后我将使用此查询搜索bussId:
SELECT * WHERE word LIKE 'searched_word%'.
通过这种方式,我将确保MySQL将使用索引,它会更快,但这个表将包含大约2000万行!
还有其他解决方案吗?
您必须使用MyISAM或来自MySQL 5.6的InnoDB的全文索引:
mysql> ALTER TABLE business ADD FULLTEXT(nameEn, keywords);
Run Code Online (Sandbox Code Playgroud)
这是你的要求:
mysql> SELECT * FROM business
-> WHERE MATCH (nameEn, keywords) AGAINST ('searched_word');
Run Code Online (Sandbox Code Playgroud)