【问题标题】:SQLite: Performance of Rows VS ColumnsSQLite:行 VS 列的性能
【发布时间】:2011-12-03 09:36:00
【问题描述】:

我有一个数据库表,其中每一行(电影)都有几个数字标签(电影类别)。目前我将所有这些标签作为字符串放在同一列中,并使用 %LIKE% 搜索它们,当我需要查找某个类别中的所有电影时,这需要缓慢的全表扫描。

我想加快搜索这些标签的速度,但我能想到的唯一解决方案是创建第二个包含两个整数列的表。第一个包含单个类别,第二个包含电影的 rowid。

但是,这将需要在数据库中进行更多的插入。一行平均有 10 个标签,所以我必须插入 11 行,而不是插入单行。由于我的应用程序执行的插入操作比实际查询多得多,因此插入性能至关重要。

在不牺牲插入性能的情况下,还有其他方法可以解决这个问题吗?或者插入 1 行 10 列 VS 10 行 2 列之间没有太大区别吗?

【问题讨论】:

  • 1.确保使用事务(插入相对快速,提交非常昂贵) 2. 使用/尝试“标准”标准化 MM 标签方法(也可能使用/尝试 1-M允许标签重复[较少标准化]:关键是使用索引)3. 对所有内容进行基准测试并再次评估。
  • 1.) 我已经使用 transactions/pragma 进行插入 2.) M-M 方法?
  • 我知道电影是大生意,但我不知道它们的发行速度如此惊人。您的数据录入人员一定很棒。
  • @Joshua A MM 就像 movies (movie_id, movie_title) <- movies_tags (movie_id, tag_id) -> tags (tag_id, tag_text) 而 1-M 可能是 movies (movie_id, movie_title) <- tags (movie_id, tag_text) (有点像帖子;id [这实际上是一个 FK] 被非规范化为价值,如果谈论自然 PK,一切都会变得模糊 ;-)。不过,我肯定会首先对更新进行基准测试(我以超过 20k 条记录/秒的速度更新,不要三思而后行)——如果它有效,它就有效,我怀疑它会正常工作。确保添加适当的索引,因为它们可以加快查询速度。
  • @ledorfier LOL :) 我只是用电影/类别作为比喻,它是工业数据

标签: database sqlite tags normalization normalize


【解决方案1】:

您的插入性能会稍慢一些,因为需要更新索引(至少它会在 ROWID 上有一个索引,并且您需要在类别 ID 上有一个索引来获得显着的加速)。数据大小本身是微不足道的。

但是,我希望它与事务开销相比完全相形见绌(所有对 fsync() 的调用,仅此而已)。 SQLite 对于并发写入繁重的负载非常糟糕。

如果您执行的插入操作多于查询操作,您可能需要重新考虑您的数据结构。

【讨论】:

  • 没有 fsyncs,因为我使用了 'synchronous=off' 和 'journal-mode=off' pragma's。而且也没有同步写入,只有一个线程。
猜你喜欢
  • 2013-07-23
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2012-03-17
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多