为每个“列表”创建一个新的 table 是加速数据库查询的最佳方式吗?
Is creating a new table for each `list` the best way to speed up database queries here?
我的 postgres 数据库有 lists
和 list_items
table。 list_id
列上有一个索引。为了列出列表中的所有项目,我一直在 list_items
中搜索 list_id
等于 id
的位置 lists
table.
lists
:
id
title
0
"foo"
1
"bar"
list_items
:
id
content
list_id
0
"hello"
0
1
"world"
1
2
"foobar"
0
但是,随着列表和列表项数量的增加,搜索 list_items
并将它们与列表匹配的时间会更长。
当前的实现对我有用。但是假设我想加快速度。我正在考虑在 lists
table 中增加一个名为 items_list
的专栏。在 lists
table 中创建列表时,将创建一个新的 table 并将名称存储在 items_list
中。删除列表时,items_list
引用的 table 将被删除。感觉有点别扭,不过这似乎是一个加快查询速度的好方法。
lists
:
id
title
items_list
0
"foo"
"list_0_items"
1
"bar"
"list_1_items"
list_0_items
:
id
content
0
"hello"
1
"foobar"
list_1_items
:
id
content
0
"world"
如果需要,这是加快查询速度的好方法吗?
是否有我应该尝试的其他方法或数据库(例如 noSQL)?
这样的决定总是取决于您认为最终查询可能会如何结束。
如果您将索引放在查找列上,您的初始解决方案在大多数情况下都能很好地工作。然后,您可以在 运行 搜索时使用这些 ID 将 table 连接在一起。通过将列表项放入单个 table 中,您的优势在于可以轻松规范化数据,因此特定项仅在数据库中占用 space 一次。
有时您可能会对 table 进行分类,因此它可能会获得数据的子集。也许所有以字母开头的项目,但在 table 达到特定阈值之前你不会做这种事情。您的多个解决方案确实有效,但如果您想在单个查询中一起导出数据,您将需要大量 table 的联合。
如果您从不需要查找项目是什么,只想按原样导出它们,您可以考虑使用 jsonb,它允许您将 json 二进制对象直接放入您的行旁边列表详细信息。您可以查询 json 中的项目,但它不如用于快速查找的索引数据库列那样高效。
使用您的示例,您最终会得到一个 table.
id
title
list_items
0
"foo"
['hello','foobar']
1
"bar"
['world']
如果您有更多与每个项目相关的数据,那么您可以使该项目成为键或值(取决于您的用例)来制作字典甚至是数据树。
id
title
list_items
0
"foo"
{'i1':'hello','i3':'foobar': null}
1
"bar"
{'i2':'world'}
id
title
list_items
0
"foo"
{'hello':{'note':'hello info'},'foobar': null}
1
"bar"
{'world':{'note':'some notes'}}
我的 postgres 数据库有 lists
和 list_items
table。 list_id
列上有一个索引。为了列出列表中的所有项目,我一直在 list_items
中搜索 list_id
等于 id
的位置 lists
table.
lists
:
id | title |
---|---|
0 | "foo" |
1 | "bar" |
list_items
:
id | content | list_id |
---|---|---|
0 | "hello" | 0 |
1 | "world" | 1 |
2 | "foobar" | 0 |
但是,随着列表和列表项数量的增加,搜索 list_items
并将它们与列表匹配的时间会更长。
当前的实现对我有用。但是假设我想加快速度。我正在考虑在 lists
table 中增加一个名为 items_list
的专栏。在 lists
table 中创建列表时,将创建一个新的 table 并将名称存储在 items_list
中。删除列表时,items_list
引用的 table 将被删除。感觉有点别扭,不过这似乎是一个加快查询速度的好方法。
lists
:
id | title | items_list |
---|---|---|
0 | "foo" | "list_0_items" |
1 | "bar" | "list_1_items" |
list_0_items
:
id | content |
---|---|
0 | "hello" |
1 | "foobar" |
list_1_items
:
id | content |
---|---|
0 | "world" |
如果需要,这是加快查询速度的好方法吗?
是否有我应该尝试的其他方法或数据库(例如 noSQL)?
这样的决定总是取决于您认为最终查询可能会如何结束。 如果您将索引放在查找列上,您的初始解决方案在大多数情况下都能很好地工作。然后,您可以在 运行 搜索时使用这些 ID 将 table 连接在一起。通过将列表项放入单个 table 中,您的优势在于可以轻松规范化数据,因此特定项仅在数据库中占用 space 一次。
有时您可能会对 table 进行分类,因此它可能会获得数据的子集。也许所有以字母开头的项目,但在 table 达到特定阈值之前你不会做这种事情。您的多个解决方案确实有效,但如果您想在单个查询中一起导出数据,您将需要大量 table 的联合。
如果您从不需要查找项目是什么,只想按原样导出它们,您可以考虑使用 jsonb,它允许您将 json 二进制对象直接放入您的行旁边列表详细信息。您可以查询 json 中的项目,但它不如用于快速查找的索引数据库列那样高效。 使用您的示例,您最终会得到一个 table.
id | title | list_items |
---|---|---|
0 | "foo" | ['hello','foobar'] |
1 | "bar" | ['world'] |
如果您有更多与每个项目相关的数据,那么您可以使该项目成为键或值(取决于您的用例)来制作字典甚至是数据树。
id | title | list_items |
---|---|---|
0 | "foo" | {'i1':'hello','i3':'foobar': null} |
1 | "bar" | {'i2':'world'} |
id | title | list_items |
---|---|---|
0 | "foo" | {'hello':{'note':'hello info'},'foobar': null} |
1 | "bar" | {'world':{'note':'some notes'}} |