gin 索引性能测试
使用 字符串保存标签列表,以 逗号 分隔
构造数据
drop table tbl_user;
CREATE TABLE public.tbl_user(
ID SERIAL PRIMARY KEY NOT NULL,
UserID varchar(100) NOT NULL,
UserName varchar(100) NOT NULL,
PhoneNumber varchar(20) NOT NULL
);
INSERT INTO public."tbl_user" (userid, username, phonenumber)
select
n ,
((n%100))||'name,'||((n%100+1))||'name,'||((n%100+2))||'name,'||((n%100+3))||'name,'||((n%100+4))||'name,'||((n%100+5))||'name,'||((n%100+6))||'name,'|| ((n%100+7))||'name,'||((n%100+8))||'name,'||((n%100+9))||'name',
random()
from generate_series(1,1000000)n;
--create index idx_tbl_user_username on tbl_user using btree(username);
create extension pg_trgm;
create index idx_tbl_user_username on tbl_user using gin(username gin_trgm_ops);
Planning Time: 0.213 ms
Execution Time: 2095.709 ms
explain (timing, verbose, analyse, buffers, costs,timing)
select * from tbl_user where username ~'6name|7name|100name';
Planning Time: 0.326 ms
Execution Time: 1929.220 ms
使用 varchar 数组保存 标签列表
drop table if exists tbl_user2;
create table if not exists tbl_user2(id int, name text, phone_number_list text[]);
set maintenance_work_mem to '2GB';
insert into tbl_user2
select n , n||'name' , array[
(n%((random()*99)::INT+1))::text||'phone',
(n%((random()*98)::INT+2))::text||'phone',
(n%((random()*97)::INT+3))::text||'phone',
(n%((random()*96)::INT+4))::text||'phone',
(n%((random()*95)::INT+5))::text||'phone',
(n%((random()*94)::INT+6))::text||'phone',
(n%((random()*93)::INT+7))::text||'phone',
(n%((random()*92)::INT+8))::text||'phone',
(n%((random()*91)::INT+9))::text||'phone',
(n%((random()*90)::INT+10))::text||'phone'
]
from generate_series(1,1000000) n;
create index idx_tbl_user2_parent_label_name on tbl_user2 using gin(phone_number_list);
Planning Time: 0.065 ms
Execution Time: 17.456 ms