在 WHERE 子句中过滤

提升 PostgreSQL 查询性能

Amy McCarty

Instructor

限制数据

顺序 子句 作用
1 FROM 指定表
2 WHERE 筛选/限制记录

 

  • 发生较早
  • 记录更少
提升 PostgreSQL 查询性能

EXPLAIN

EXPLAIN
SELECT * FROM phones

 

Seq Scan on phones (cost = 0.00..22.7
                    ,rows=1270
                    ,width=36)
  • 执行步骤数

查询规划器

多人围着一口大锅做饭

提升 PostgreSQL 查询性能

带 WHERE 的 EXPLAIN

EXPLAIN
SELECT * FROM phones
WHERE phone_code = 235

 

Seq Scan on phones (cost = 0.00..25.8
                    ,rows=6,width=636)
  Filter: (phone_code=235)

查询规划器

多人围着一口大锅做饭

提升 PostgreSQL 查询性能

良好——用 LIKE OR 过滤相似值

country phone_code reliability
乍得 235
中国 86
哥斯达黎加 506
印度 91
印度尼西亚 62
伊拉克 964
EXPLAIN
SELECT * FROM phones
WHERE country LIKE 'Ch%' 
  OR country LIKE 'In%'

 

Seq Scan on phones (cost = 0.00..29.05
                    ,rows=13,width=36)
  Filter: ((country~~'Ch%'::text)
           OR(country~~'In%'::text))
提升 PostgreSQL 查询性能

更佳——用 LIKE ANY 过滤相似值

country phone_code reliability
乍得 235
中国 86
哥斯达黎加 506
印度 91
印度尼西亚 62
伊拉克 964
EXPLAIN
SELECT * FROM phones
WHERE country 
  LIKE ANY(ARRAY['Ch%','In%'])

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: ((country~~ANY('{Ch%,In%}'
                          ::text[]))
提升 PostgreSQL 查询性能

良好——用 OR 精确匹配值

country phone_code reliability
乍得 235
中国 86
哥斯达黎加 506
印度 91
印度尼西亚 62
伊拉克 964
EXPLAIN
SELECT * FROM phones
WHERE country = 'Chad' 
  OR country = 'China'

 

Seq Scan on phones (cost = 0.00..29.05
                    ,rows=13,width=36)
  Filter: ((country='Chad'::text)
           OR(country='China'::text))
提升 PostgreSQL 查询性能

更佳——用 IN 精确匹配值

country phone_code reliability
乍得 235
中国 86
哥斯达黎加 506
印度 91
印度尼西亚 62
伊拉克 964
EXPLAIN
SELECT * FROM phones
WHERE country IN ('Chad','China')

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: ((country=ANY('{Chad,China}'
                          ::text[]))
提升 PostgreSQL 查询性能

最佳——按数字过滤

country phone_code reliability
乍得 235
中国 86
哥斯达黎加 506
印度 91
印度尼西亚 62
伊拉克 964
EXPLAIN
SELECT *
FROM phones
WHERE phone_code IN (235,86) 

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: (phone_code=ANY('{235,86}'
                          ::integer[]))
提升 PostgreSQL 查询性能

总结最佳 WHERE 过滤方式

 

数字型优势

  • 更短
  • 占用更小
  • 性能更快
提升 PostgreSQL 查询性能

总结最佳 WHERE 过滤方式

 

数字型优势

  • 更短
  • 占用更小
  • 性能更快

 

良好 更佳
文本 数字
OR IN,ARRAY
提升 PostgreSQL 查询性能

Vamos praticar!

提升 PostgreSQL 查询性能

Preparing Video For Download...