我必须编写一个简单的查询,在其中查找以 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
例如,假设我有一个中等行数(约 100,000 行)的表,其中一jsonb列包含以下示例数据:
{"name":"Bob", "favoriteColor":"red", "someOtherObject": {"somethingElse": true}}
Run Code Online (Sandbox Code Playgroud)
是否更有效:
在 jsonb 列上使用 GIN 索引,然后使用 Postgres 的内置 JSON 查询函数来提取数据
创建多列来表示可以搜索的内容,即一列用于name,一列用于favoriteColor等;在这些列上构建 b 树索引,然后运行select document from table where name = 'Bob'
一些其他的解决方案?
请记住,解决方案需要有效地支持like查询,以便能够搜索以给定输入字符串开头的值。
在用户可以在多个设备上安装移动应用程序副本的应用程序中,我想知道每个用户拥有多少个 iphone 和多少个 android 应用程序。
我尝试了一个查询,例如
gv2=> SELECT userid,
COUNT(ALL version_identifier LIKE '%ios%'),
COUNT(ALL version_identifier LIKE '%android%')
FROM gl.user_device
GROUP BY userid;
userid | count | count
--------------------------------------+-------+-------
46d0f5b7-42b0-4aad-9162-1390c32cb06e | 7 | 7
5d519794-abfe-4863-82d4-6da33db7637b | 7 | 7
a81cff6b-30f2-4b6e-a5bf-b1a933904473 | 1 | 1
b65f0708-0cd1-11e7-878b-06fa189da46b | 4 | 4
94b91b02-ff43-4a9a-b317-037fa2a347d3 | 1 | 1
a4cacd98-1216-4801-b058-b28b8fa632a9 | 8 | 8
(6 rows)
Run Code Online (Sandbox Code Playgroud)
这显然是错误的。
例如
gv2=> SELECT userid FROM gl.user_device WHERE version_identifier LIKE '%ios%';
userid
--------------------------------------
5d519794-abfe-4863-82d4-6da33db7637b
(1 row)
Run Code Online (Sandbox Code Playgroud)
万一我需要支持 Postgres 10.1,但最好也支持 9.5.10,因为我有一个旧的生产数据库仍然在那个版本上。