为何操作员如此快速

时间:2014-11-27 08:29:51

标签: sql database algorithm sql-like

你们都知道sql中的like运算符。例如:

select * 
from customer 
where email like '%goog%'

所以我的问题是数据库如何能够如此快速地返回结果呢? 当我编写这样的函数时,我会遍历所有客户和每封电子邮件。但这很慢。我听说过索引。当数据库不知道第一个或最后一个字母是哪个时,数据库如何使用索引?或者他们是另一种方式吗?

我不想编写类似这样的内容。我只想知道它是如何工作的。

3 个答案:

答案 0 :(得分:2)

我不知道你正在使用什么引擎以及它实际引擎盖下面的内容但是这里有一些关于这个问题的有用信息:

  1. 通常,SQL引擎在列中使用自由文本搜索,以便能够更快地提取查询。这是通过创建inverted index来完成的,该Apache Lucene从每个单词映射到"文档" (行,列)包含它们。一个广泛使用的库是Suffix Tree。不幸的是,大多数IR(信息检索)库在查询开始时不支持通配符(但它们适用于其他任何地方),因此无法在此类索引中搜索您的特定示例。
  2. 您可以使用{{3}}创建索引以支持索引开头的通配符。后缀树非常适合搜索子字符串,就像你的例子一样。但是,它们并不是非常适合搜索中间带有通配符的字符串。

答案 1 :(得分:0)

据我所知,这种查询方式效率不高 - 如果存在影响单词开头的通配符,则需要进行整个扫描。但是,如果列被索引,则DBMS只需将整个索引带入内存并扫描它而不是表的全部内容 - 通常这将是一个相对较快的任务。

答案 2 :(得分:0)

由于我们不知道您正在使用哪种RDBMS,让我们看一下数据库在这种情况下可以从索引中受益的一种方式 - 让我们通过本书探讨它/ index隐喻:

成像每行数据占据一本书的页面,并在每个页面上都有一个电子邮件地址。在本书的最后,有一个电子邮件地址索引 - 对于每个电子邮件地址,它会告诉您哪些页面包含该电子邮件地址。该索引的每个页面只包含电子邮件地址和页码。假设每页有50个电子邮件地址。

如果您想查找电子邮件地址中包含字母goog的所有网页,尽管不知道电子邮件地址的第一个或最后一个字母是什么,您认为这对您来说更容易吗?查看整本书中的每一页,或者b)扫描书后面的电子邮件索引,记下哪些页面有用(如果需要更多信息,则转到这些页面)?