我有一个表(MySQL 5.1,InnoDB),大约有3M行,其中98%只包含一个单词。如果我使用LIKE %searchterm%
运行查询,则速度太慢。
由于只有SELECT
查询此表,我正在考虑将其转换为MyISAM(因为InnoDB还没有,或者仅适用于5.6+版本,支持FULLTEXT
)。
然而,我想知道这是否会真正加快查询速度,因为据我所知,FULLTEXT索引是一个包含分词的表格(“Hello sunny day” - >“hello”,“晴天“,”日“),所以如果每列只有一个单词,那会有意义吗?
如果我在这个文本列上放置一个普通的索引会加速查询吗?
提前感谢您的帮助!
答案 0 :(得分:3)
使用FULLTEXT索引会有所帮助。它将文本拆分为单词,但随后它也会对这些单词进行索引。正是这种索引加速了查询。但是你需要使用full-text search functions而不是LIKE来利用索引。
普通索引对您没有帮助。如果LIKE子句具有常量前缀,则它只能利用索引。
yourcolumn LIKE 'searchterm%'
会使用索引。yourcolumn LIKE '%searchterm%'
不会使用索引。答案 1 :(得分:0)
全文搜索或全文索引是否对您构成任何不利影响?就个人而言,我错过了搜索单词的 part ,例如'数组'在' ByteArray'。
你可以考虑我在这里提出的方法:
https://stackoverflow.com/a/22531268/543814
这个想法是存储字符串的每个可能的后缀。
这需要更多存储空间,具体取决于您的字符串长度。
作为回报,您可以对这些查询使用普通索引:因为字符串的每个可能后缀都在表中,LIKE %searchterm%
变为相同到LIKE searchterm%
。
您不再需要前导%
,因此可以再次使用普通索引。