【问题标题】:Efficiently querying a graph structure高效查询图结构
【发布时间】:2012-07-19 19:58:18
【问题描述】:

我有一个由图表组成的数据库。我需要访问的表如下所示:

Sno    Source    Dest
1       'jack'   'bob'
2       'jack'   'Jill'
3       'bob'    'Jim'

这里Sno 是主键。 Source 和 Destination 是 2 个非唯一数字,代表我图中节点之间的一条边。我的SourceDest 也可能是字符串,不一定是数字数据类型。我的数据库中有大约 500 万个条目,我使用 Postgresql 和 Psycopg2 for python 构建了它。

查询主键非常简单快捷。但是,我需要经常查询此数据库以获取特定源连接到的所有dest。现在我通过调用查询来实现这一点:

SELECT * FROM name_table WHERE Source = 'jack'

事实证明这非常低效(每个查询最多 2 秒)并且我无法将其设为主键,因为它不是唯一的。有什么方法可以根据这些重复的值建立索引并快速查询?

【问题讨论】:

  • 您在Source 字段上设置了索引?如此处所述postgresql.org/docs/9.1/static/sql-createindex.html
  • 要设置索引,您需要将其设为主键,对吗?它不需要唯一的密钥吗?如果不是,我该如何设置这个索引?
  • 您应该阅读我发布的文档。这会告诉您关于使用 PostgreSQL 进行索引的一切

标签: python sql database postgresql


【解决方案1】:

这应该会使您的查询速度更快。

CREATE INDEX table_name_index_source ON table_name Source;

但是,您可以使用许多选项

PostgreSQL 文档

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ name ] ON table [ USING method ]
    ( { column | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ WITH ( storage_parameter = value [, ... ] ) ]
    [ TABLESPACE tablespace ]
    [ WHERE predicate ]

在他们的Documentation 中阅读有关使用 PostgreSQL 进行索引的更多信息。

更新

如果你的桌子和你一样,这肯定会有所帮助。但是,如果您的数据集正在增长,您可能应该考虑更改架构以具有可以更有效地索引的唯一值。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2022-01-04
    相关资源
    最近更新 更多