【问题标题】:How to create indexes faster如何更快地创建索引
【发布时间】:2011-10-12 02:18:32
【问题描述】:

我有一个大约 60GB 的表,我正在尝试创建索引, 而且速度很慢(差不多一天,而且还在运行!)

我看到大部分时间都在磁盘 I/O(4MB/s) 上,它并没有太多使用内存或 cpu

我试过:运行 'pragma cache_zise = 10000' 和 'pragma page_zise=4000' (在我创建表之后),它仍然没有帮助。

如何让“创建索引”在合理的时间内运行?

【问题讨论】:

  • 也许阻止 sqlite 的 fsync 可能会有所帮助,并且应该不是问题,如果这是一次性操作。
  • ooor 向某人借了一个 ssd :)
  • 我现在正在与同样的事情作斗争。它需要永远,不知道需要多长时间。 (我的只有 12 个演出)

标签: sql sqlite


【解决方案1】:

当你创建表时,你应该创建索引。 PS:你应该考虑索引是正确的。你不需要在运行时创建索引。

【讨论】:

  • 这是个好建议。我会尝试将您的 sqlite db 中的数据导出到已应用索引的重复空 sqlite db 并测试需要多长时间。
  • 这个建议不好。如果你对这么大的表有任何实际经验,你就会知道,如果你先创建索引,你永远无法完成插入......
  • 同意高文秋。先创建索引,再添加数据,相比于添加大量数据后创建索引,插入时间增加了许多数量级。
【解决方案2】:

在数据库表上创建索引是一次性操作,它可能会很昂贵,这取决于许多因素,包括索引中包含多少字段和什么类型,要索引的数据表的大小,运行数据库的机器的硬件,甚至更多。

为了对加快速度给出一个合理的答案,我们需要知道表的架构、您正在创建的索引的定义、您是否有理由确定您是否在索引中包含数据的唯一性独特的,您的服务器的硬件规格是什么,您的磁盘速度是多少,磁盘上有多少可用空间,您使用的是 RAID 阵列,RAID 的级别,您有多少内存以及利用率是多少。等等……

说了这么多,这可能会更快,但我还没有测试过。

为您要索引的表制作一个结构重复的表。 将索引添加到新的空表中。 将旧表中的数据分块复制到新表中。 删除旧表。

我的理论是,在添加数据时对其进行索引要比挖掘已经存在的数据并在事后添加索引更便宜。

【讨论】:

  • 我不知道 SQLite 的内部结构,但这绝对不适用于 MS SQL Server。事实上,在批量加载表时,删除所有索引、填充表然后重新创建索引通常更快。索引不是一次性的。它们必须维护,这意味着表上的每个插入和潜在更新都需要在索引中移动数据。一次执行这一行一百万次通常比对数据运行一次单一排序算法的成本要高得多。
  • 同意,索引会不断调整。然而,SQLite 是一个基于文件的系统,更像是 MS Access,而不是 SQL Server 或 MySQL 或 POSTGRESQL ......所以它可能会更快,但就像我说的我没有测试过该方法,为轻量级引擎提供更小的块来消化在 SQLite 中可用。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多