小编典典

两个sql查询的性能之间的区别?

sql

我的表中有一个具有文本数据类型的字段。

以下两个sql查询的性能是否有所不同:

 select * from tablename where fieldname="xyz%";
 select * from tablename where fieldname="%zyx";

如果我们要实现这些查询的执行,那么我认为这是我们需要做的:

我们必须匹配两个正则表达式(xyz zyx)。

我们必须从头开始检查字符串chars。

对于第一个查询,我们将必须读取前三个字符以查看是否存在匹配项,但是对于第二个查询,我们将必须读取直至获取字符串的末尾以确定是否已发生匹配。但是,如果我们将字符串的长度存储在某个位置,则可以直接读取后三个字符,从而获得与第一种情况相似的性能。

我的问题是,诸如mysql和oracle之类的商业数据库是否在执行查询方面表现出任何差异。


阅读 181

收藏
2021-04-22

共1个答案

小编典典

从您的评论中获取意见:“我只想知道匹配开始与匹配结束之间是否存在差异”。

首先-请记住,我们并不是在寻找匹配字符串的最佳算法。我们正在寻找最佳算法,以找到一组N行中的所有匹配字符串。我们想要做得比“做算法X,N次”更好。

如果未对fieldname进行索引,则两个查询之间的性能差异将很小-SQL引擎将只对字符串的前3个字节或后3个字节进行匹配,这只是偏移到正确的内存位置。

如果对字段名进行索引,则两次搜索之间的性能将存在巨大差异,因为我们可以丢弃大部分数据,而不是检查所有N行。

即对于“ xyz%”版本,我们可以使用二进制搜索。

我们从中间元素开始,恰好是“ peter”。我们可以立即丢弃“ peter”之前的所有内容,并获取其余部分的中间元素-“
samantha”,依此类推,直到找到以“ xyz”开头的条目。

对于“%xyz”版本,我们无法执行此操作,因为任何字符串都可能在末尾匹配,因此我们需要查看每个字符串。

随着表格规模的扩大,这两种方法之间的差异会变得很大。

为字段名反向创建字段/索引的解决方案使我们可以再次使用二进制搜索技术。(在某些数据库中,实际上可以在不创建额外字段的情况下执行此操作,而是通过使用特定的索引类型,虚拟列等)。

这已大大简化-有关数据库索引的实际实现的详细信息,请查看B-Tree和B * Tree索引。

2021-04-22