工作中有这个一个需求,开发反应search_history查询太慢了,看怎么优化一下。
data=> \timing
启用计时功能.
data=> SELECT *
data-> FROM
data-> (
data(> SELECT s.org_id,user_id,id_no,MIN (s.create_date) AS create_date,T.corp_type AS TYPE
data(> FROM
data(> search_history s,
data(> tech_org_info T
data(> WHERE
data(> s.org_id != 'Credittone'
data(> AND ID != '48459fc5-ca41-4fce-a548-f4267929453f'
data(> AND id_no = '140104197007091720'
data(> AND s.create_date > '2016-01-01 00:00:00'
data(> AND s.org_id = T .org_id
data(> GROUP BY s.org_id,user_id,id_no,LEFT (s.create_date, 10),T.corp_type LIMIT 100
data(> ) tab
data-> ORDER BY create_date DESC;
org_id | user_id | id_no | create_date | type
---------+---------+--------------------+-----------------------+------
XIAONIU | XIAONIU | 140104197007091720 | 2016-01-21 09:32:03.0 | 小贷
XIAONIU | XIAONIU | 140104197007091720 | 2016-01-12 14:28:56.0 | 小贷
(2 行记录)
时间:1204.422 ms
我们看到用时1秒多,要等待一会儿才能看到结果,系统的处理还要花费一些时间,用户体验可想而知了。
- 一条SQL查询语句的查询时间控制在多长时间内比较好?
答案是:一个实例上95%的sql在1s之内。
分析一下这个SQL,看到表join,先去掉join试试:
data=> SELECT org_id,user_id,id_no,MIN(create_date) AS create_date
data-> FROM
data-> search_history
data-> WHERE
data-> org_id != 'Credittone'
data-> AND id != '48459fc5-ca41-4fce-a548-f4267929453f'
data-> AND id_no = '140104197007091720'
data-> AND create_date > '2016-01-01 00:00:00'
data->GROUP BY org_id,user_id,id_no,LEFT(create_date, 10) LIMIT 100;
org_id | user_id | id_no | create_date
---------+---------+--------------------+-----------------------
XIAONIU | XIAONIU | 140104197007091720 | 2016-01-12 14:28:56.0
XIAONIU | XIAONIU | 140104197007091720 | 2016-01-21 09:32:03.0
(2 行记录)
时间:1185.436 ms
时间依然是1s多,跟join关系不太大。
看一下表的索引:
data=> \d+ search_history
资料表 "public.search_history"
栏位 | 型别 | 修饰词 | 存储 | 统计目标 | 描述
---------------+------------------------+--------+----------+----------+---------------------------------
id | character varying(64)