MySQL模糊搜索的大O是什么?它是否因索引类型而异,如果是这样,哪些表现最佳?
e.g。 SELECT * FROM foo WHERE field1 LIKE '%ello Wo%';
我不确定基础数据类型,它拥有什么样的魔力。像trie(https://en.wikipedia.org/wiki/Trie)之类的东西对于最后模糊的搜索来说会很好,例如LIKE 'Hello Wo%'
。
我猜测Big-O是O(n)
,但希望确认。模糊搜索之间甚至可能存在差异,例如%ello Wo%
与Hello W%
与%lo World
与%ell%o%W%or%
是否有不同的索引方法可以提供更好的性能?如果是,对于特定情况,请您分享一下吗?
答案 0 :(得分:2)
使用领先的通配符
MySQL将
LIKE
; 大部分时间都花在步骤1中,即O(N),其中N是行数。花在步骤2和3上的时间要少得多。
没有领先的通配符
WHERE col LIKE 'Hello W%'
,那么它将找到索引中以Hello W
开头的所有行。它们将在索引中连续,使这一步更快。有许多变量(缓存,行数,行的随机性等)导致#1的成本是否比#2更高或更低。但这可能比前导通配符情况要快得多 - O(n),其中n
是以'Hello W'开头的行数。