首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加两个简单的索引来优化查询

添加两个简单的索引来优化查询
EN

Stack Overflow用户
提问于 2017-12-14 04:50:04
回答 2查看 44关注 0票数 0

我是SQL表优化方面的新手,所以我有一个简单/基本的问题;我有两个SQL表t1和t2。如果我必须添加两个简单的索引来优化查询,我应该选择哪一个?为什么?(请注明详情)

代码语言:javascript
复制
CREATE TABLE t1 (
    a int Primary Key,
    b int NOT NULL, 
    c char(10) references t2(e),
    d char(5)
);

CREATE TABLE t2 (
    e char(10) Primary Key
);

SELECT a
FROM t1 JOIN
     t2 
     ON c = e
WHERE abs(b)>50
ORDER BY d;
EN

回答 2

Stack Overflow用户

发布于 2017-12-14 04:57:49

您需要在the expression abs(b)上建立索引,因为在b上建立简单的索引不会有什么帮助。

t1上的指数也应该包括d,希望能帮助订单。

t1上的索引还应包括ac,以使其成为index-only scan

t2上的索引应该包括e1来帮助连接,并且这应该由它的主键来满足。

代码语言:javascript
复制
CREATE INDEX bk ON t1 (abs(b), d, a, c);

这是我的尝试,但我不是一个普通的PostgreSQL用户,我也没有测试过它。

票数 2
EN

Stack Overflow用户

发布于 2017-12-14 05:18:00

代码语言:javascript
复制
CREATE TABLE t2 (
    e char(10) Primary Key
);

e列是一个主键,所以您不需要在这里创建任何索引,因为根据the documentation:,索引已经存在

为表定义唯一约束或主键时,

PostgreSQL会自动创建唯一索引。索引涵盖构成主键或唯一约束(如果适用,则为多列索引)的列,并且是强制实施约束的机制。

对于查询中的这两个条件:

代码语言:javascript
复制
     ON c = e
WHERE abs(b)>50

在表t1中的c列上创建索引。

您也可以在( c, abs(b) )上尝试多列函数索引,但前者应该足够了。如果您决定尝试一下,那么请记住c列必须是索引中的第一列,因为这一列在=运算符中使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47801897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档