【发布时间】:2015-04-23 05:34:09
【问题描述】:
- 我有一个约 40Gb 的数据库,其中包含大约 100 个表。
- 索引表(在所有列上)大约需要 30 分钟。
- 我的服务器中有 64 个内核。
目前,INDEX 创建过程大约需要 2 天(而数据库创建大约需要 5 小时......)所以它是我管道中的一个极端瓶颈。我正在尝试考虑如何并行化该过程以一次使用多个核心。到目前为止,这是我的想法:
- 关闭所有写锁定(不知何故?)并使用多个进程来创建索引。由于他们的桌子不同,所以可能没问题。
- .将主数据库中的每个表转储到自己的小数据库中(仅包含一个表),在不同的内核上分别索引它们,然后将它们重新连接在一起(不知何故?)
- 优化现有数据库(以某种方式?)以帮助索引器更快地完成任务。可以将数据库移动到 SSD 并使用单个大 CPU 来计算索引(可能会节省一天),或者在创建数据库时对行进行排序?显然不是并行解决方案,但在这一点上,我会采取任何措施。
编辑: 我使用 SQLite 版本 3.3.6
【问题讨论】:
-
不清楚,是只需要创建一次索引还是时不时重复这个过程?如果需要重复,那么需要从头开始重建所有索引的应用是什么?
-
我只需要为我的数据库创建一次索引(一旦添加了一个表,它就永远不会更新),但是整个 40Gb 数据库不时使用新的/不同的数据创建跨度>
-
您还写了您正在为表中的所有列创建索引,这是必要的吗?索引通常是为一组有限的列创建的。
-
好的,那么您的建议 1 和 2 似乎可行。但是如果你先创建空表,然后创建索引,然后插入数据呢?您不必在大数据上建立索引,它会随着表的增长逐步更新。
-
有了这么大的数据库,我会考虑迁移到“真正的”数据库服务器(例如 Postgres),而不是使用像 SQLite 这样的进程内数据库