【问题标题】:I/O bound by reads? Ways to optimize?I/O 受读取限制?优化方法?
【发布时间】:2016-10-24 07:36:08
【问题描述】:

在 SQLite 中,我使用 SELECT 从一个数据库中读取数据,执行一些修改并将其写入另一个数据库。

查看iotop 的输出,进程性能(仅使用一个内核)受 I/O 限制(IO>80%,CPUiotop 中看到的大部分操作都在“磁盘读取”下进行,只是偶尔会在“磁盘写入”下显示一些内容。

进程性能是否可能受SELECT/read 事务的约束?基本上我在网上看到的所有与 SQLite 性能相关的信息都是关于 INSERT/write 的。读取数据有什么需要了解和优化的吗?

一个低效的查询,即在缺少索引的字段上通过 SELECT 对 IO 的影响是否比对 CPU 的影响更大?

【问题讨论】:

  • 如果您有很多写入,您可以通过将它们合并到一个事务中来进行优化。优化读取更难……
  • 这个问题太宽泛了。如果您想加快特定查询的速度,请询问这些。
  • 在开始之前,请考虑将正在读取的数据库放在 RAMdisk 上。
  • @MarkSetchell 那太好了,只是我怕文件太大(155GB 文件 vs 192GB 内存)...
  • 你的硬件是什么?如果您从单个 S-L-O-W 5,400 RPM SATA 驱动器读取数据,您将很幸运能够获得 50-60 IO 操作/秒。 @MarkSetchell 关于 RAMdisk 的评论是运行速度更快的最简单方法的具体实现:在更快的硬件上运行它。

标签: performance io sqlite


【解决方案1】:

这个问题相当广泛,所以答案也是:是的,在缺少索引的字段上进行选择会对 IO 产生很大影响。

根据您的查询、架构和数据,SQLite 可能会执行全表扫描。

运行 explain query plan 可以让您很好地了解 SQLite 在您的特定情况下正在做什么。

【讨论】:

  • 是的,但是所有相关字段都已编入索引。还有其他优化方法吗?
  • 这取决于您的架构和查询。 Explain Query Plan 会告诉你你的索引是否真的被使用了。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2012-06-04
  • 2011-02-03
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多