在查询数据库中是否有某些字符列以某些内容开头并以某些内容结尾时是否有任何性能差异?
SELECT * FROM table WHERE column like '%something'
SELECT * FROM table WHERE column like 'something%'
选择一种方法而不是另一种方法有任何缺点吗?忽视用户匹配单词开头或结尾的需要 它的实现方式可能算法有所不同吗?
答案 0 :(得分:2)
SQL优化器将在第二个示例中查找列上的索引,并将其缩小到以通配符之前的字符开头的记录。在第一个示例中,它不能缩小范围,因此您需要扫描索引或表(取决于索引结构)。
您使用的是哪种SQL产品?
答案 1 :(得分:2)
如果按字母顺序索引,第二个会更快。否则我想他们会是一样的。
答案 2 :(得分:2)
另外请注意,如果您确实需要支持%something
。
你可以添加一个反转字符串的新列,然后在列的反面创建一个索引,它变为gnihtemos
现在,如果您在开头检测到通配符,请反转搜索字符串并搜索反向列而不是主列。您将获得索引的速度优势,但需要额外代码才能使反向列保持同步...
答案 3 :(得分:2)
而不是创建新的列和索引来处理
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')
将实现同样的目标。