使用PostgreSQL 10.5。我正在尝试创建一个分页系统,用户可以在其中来回切换各种结果。
为了不使用OFFSET,我id在名为p(prevId)的参数中从上一页的最后一行传递了。然后我选择id高于p参数中传递的数字的前三行。(如本文所述)
例如,如果id上一页的最后一行是 5,我会选择前 3 行的 anid大于 5:
SELECT
id,
firstname,
lastname
FROM
people
WHERE
firstname = 'John'
AND id > 5
ORDER BY
ID ASC
LIMIT
3;
Run Code Online (Sandbox Code Playgroud)
这很好用,而且时机也不错:
Limit (cost=0.00..3.37 rows=3 width=17) (actual time=0.046..0.117 rows=3 loops=1)
-> Seq Scan on people (cost=0.00..4494.15 rows=4000 width=17) (actual time=0.044..0.114 rows=3 loops=1)
Filter: ((id > 5) AND (firstname = 'John'::text))
Rows Removed by Filter: …Run Code Online (Sandbox Code Playgroud) postgresql performance index paging postgresql-10 query-performance
我们在查询生产数据库中的表时遇到问题。一个文本列将与我们在 where 子句中过滤的字符串相等,但 postgres 不会选择该行。(我们在 postgres 11.11 上)我们的表设置如下:
(PROD)=> \d names;
Table "public.names"
Column | Type | Collation | Nullable | Default
----------------------+-----------------------------+-----------+----------+---------
name | text | | not null |
processed_name | text | | not null |
name_index | integer | | not null |
when_created | timestamp without time zone | | not null |
Indexes:
"names_pkey" PRIMARY KEY, btree (name, processed_name)
"names_name_index_key" UNIQUE CONSTRAINT, btree (name_index)
"ix_names_name" btree (name)
"ix_names_processed_name" btree (processed_name)
Run Code Online (Sandbox Code Playgroud)
当我们处理名称列表时,我们会检查它们是否已经在表中,以防止重复添加和违反主键约束。
然而,在一个名字上,'?????? ????????? ???????',查看名称是否已经存在的查询返回一个空集, …
语境:
出于好奇,我正在为我的应用程序进行负载测试。然后结果发生了很多并发插入。
在创建端点上进行负载测试后,我尝试在 Fetch 端点上进行负载测试,包括测试分页。对于分页,我组合了两列:id(带有 UUID v4 的 PK)和created_time。另外,我还添加了索引以加快排序速度。我从这里遵循这些解决方案。
问题:
由于数据是同时插入的,因此有几行具有相同的created_time,在我的例子中,同一时间戳最多有100(行)。
这是我的表架构,一个示例
BEGIN;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
DROP TABLE IF EXISTS "payment_with_uuid";
CREATE TABLE "payment_with_uuid" (
id VARCHAR(255) PRIMARY KEY NOT NULL DEFAULT (uuid_generate_v4()),
amount integer NULL,
name varchar(255) default NULL,
created_time TIMESTAMPTZ NOT NULL DEFAULT (now() AT TIME ZONE 'utc')
);
CREATE INDEX idx_payment_pagination ON payment_with_uuid (created_time, id);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
这是我的查询,
SELECT * from payment_with_uuid ORDER BY created_time DESC, id DESC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
它将返回 10 行付款,假设数据如下所示,并假设时间戳在第 …