1

在数据库中查询以某物开头并以某物结尾的某些字符列是否有任何性能差异?

SELECT * FROM table WHERE column like '%something'
SELECT * FROM table WHERE column like 'something%'

选择一种方法而不是另一种方法有什么缺点吗?忽略用户需要匹配单词的开头或结尾。
它的实现方式可能算法在某些方面有所不同?

4

4 回答 4

5

而不是创建一个新的列和索引来处理

SELECT * FROM table WHERE column like '%something'

查询,你可以创建一个索引

CREATE INDEX rev_col_idx ON table (reverse(column) text_pattern_ops);

然后将上面的查询重写为

SELECT * FROM table WHERE reverse(column) like reverse('%something')

这将实现同样的目标。

于 2016-11-23T20:57:15.137 回答
3

另外请注意,如果您确实需要支持 %something.

您可以添加一个字符串反转的新列,然后在列的反面创建一个索引,所以它变成gnihtemos

现在,如果您在开头检测到通配符,请反转搜索字符串并搜索反转列而不是主列。您将获得索引的速度优势,但需要额外的代码来保持反向列同步......

于 2013-08-28T22:55:46.373 回答
2

SQL 优化器将在第二个示例中查找列上的索引,并将其缩小到以通配符之前的字符开头的记录。在第一个示例中,它无法缩小范围,因此您需要扫描索引或表(取决于索引结构)。

您使用的是哪种 SQL 产品?

于 2013-08-27T18:32:59.390 回答
2

如果您按字母顺序索引第二个会更快。否则我想他们会是一样的。

于 2013-08-27T18:37:09.503 回答