【问题标题】:How to create index for join tables如何为连接表创建索引
【发布时间】:2021-02-23 07:25:03
【问题描述】:

我是索引新手,遇到了 Postgresql 一直说我的代码有错误的问题。

是否需要在引用members 表主键的bookings 表上添加外键。

如果我的 SQL 表结构如下,并且我有一个使用 joindate 的带有 WHERE 子句的 JOIN 查询,我该如何实现索引

SELECT *
FROM bookings b
JOIN members m ON m.memid = b.memid WHERE joindate > '2012-08-01';
bookings                                   members
---------                                 ----------
PK: bookid                                 PK: memid
facid                                      surname
memid                                      firstname
starttime                                  address
slots                                      joindate
                                           recommendedby

我尝试的查询

CREATE JOIN INDEX join_memid_index FOR members JOIN bookings ON  bookings.memid = members.memid

这是我在上面查询时遇到的错误

错误:“JOIN”处或附近的语法错误
第 1 行:创建 JOIN INDEX join_memid_index FOR members JOIN bookings...
^
SQL 状态:42601
字符:8

【问题讨论】:

  • 加入不需要索引(用于提高性能)。 Postgresql 一直说我的代码有错误 提供完整且未更改的查询文本和完整未更改的错误消息。
  • 您实际使用的是哪些 dbms?
  • 如果您使用的是 postgresql,为什么要标记问题 mysqlsql-server?这些是不同的数据库产品
  • 你从哪里得到 'CREATE JOIN INDEX' - 在 postgresql 文档 postgresql.org/docs/9.1/sql-createindex.html987654323@ 中没有提到索引创建中的加入
  • CREATE INDEX,不是CREATE JOIN INDEX

标签: sql postgresql


【解决方案1】:

索引是表的局部结构。它只改进查询,不执行操作。

您必须单独索引每个表:

CREATE INDEX idx_members_memid ON members (memid);
CREATE INDEX idx_bookings_memid ON bookings (memid);

如果服务器认为这将提高性能,它将使用此索引来进行更有效的连接过程。如果它不决定这样做,它将忽略索引的存在并使用表扫描。

顺便说一句,服务器可能会做出错误的决定......

也许members 上包含joindate 列的复合索引将比memid 的单个索引更有效:

CREATE INDEX idx_members_memid_joindate_1 ON members (memid, joindate);
CREATE INDEX idx_members_memid_joindate_1 ON members (joindate, memid);

只有执行计划调查会显示服务器将使用members(或无)的上述 3 个索引中的哪一个。它的决定可能会根据数据统计(行数,总计和匹配条件)和参数值而改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2017-11-03
    • 2012-01-31
    • 1970-01-01
    • 2017-11-05
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多