MySQL模糊搜索的大O.

时间:2016-03-15 18:37:40

标签: mysql database indexing big-o fuzzy-search

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%

的对比

是否有不同的索引方法可以提供更好的性能?如果是,对于特定情况,请您分享一下吗?

1 个答案:

答案 0 :(得分:2)

使用领先的通配符

MySQL将

  1. 扫描表格中的所有行(不是索引)。这称为“表扫描”。 (假设没有进行其他过滤。)
  2. 对于每一行,请扫描有问题的列LIKE;
  3. 发送未过滤的行。
  4. 大部分时间都花在步骤1中,即O(N),其中N是行数。花在步骤2和3上的时间要少得多。

    没有领先的通配符

    1. 在该列上使用索引(如果有一个),以限制要搜索的行数。如果您在列上有索引并且正在说WHERE col LIKE 'Hello W%',那么它将找到索引中以Hello W开头的所有行。它们将在索引中连续,使这一步更快。
    2. 对于其中的每一个,请进入行的数据并执行其他任何操作。
    3. 有许多变量(缓存,行数,行的随机性等)导致#1的成本是否比#2更高或更低。但这可能比前导通配符情况要快得多 - O(n),其中n是以'Hello W'开头的行数。