我必须编写一个简单的查询,在其中查找以 B 或 D 开头的人名:
SELECT s.name
FROM spelers s
WHERE s.name LIKE 'B%' OR s.name LIKE 'D%'
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法重写它以提高性能。所以我可以避免or和/或like?
postgresql index regular-expression pattern-matching string-searching
谁能解释一下 LIKE 运算符是如何在当前数据库系统(例如 MySQL 或 Postgres)中实现的?或者指出一些解释它的参考资料?
天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但我有一种感觉(希望)这些系统做一些更聪明的事情。
mysql postgresql performance full-text-search pattern-matching
我有一个包含超过 20M 元组的 Postgres 表:
first_name | last_name | email
-------------------------------------------
bat | man | batman@wayne.com
arya | vidal | foo@email.com
max | joe | bar@email.com
Run Code Online (Sandbox Code Playgroud)
要过滤我正在使用的记录:
SELECT *
FROM people
WHERE (first_name || '' || last_name) ILIKE '%bat%man%' OR
first_name ILIKE '%bat%man%' OR
last_name ILIKE '%bat%man%' OR
email ILIKE '%bat%man%'
LIMIT 25 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
即使使用索引,搜索也需要将近一分钟才能返回结果。
有索引的(first_name || '' || last_name),first_name,last_name和email。
我可以做些什么来提高此查询的性能?
postgresql performance index full-text-search postgresql-performance
编辑:转述问题 - 我在什么时候从 varchar 切换到 text 并返回?
关于这个问题的一点背景。假设我们有 sales_orders 表,我们希望能够在订单上保留一个带有客户或销售代表评论的注释字段。它需要是可搜索的LIKE "%goldfinger's gun%"我们知道我们不会在字段中存储“战争与和平”,但同时它应该足够大以处理一两句话。
那么哪个选项是:
假设 MySQL(InnoDB) 或 PostgreSQL 用例