【问题标题】:Insert values into sqlite database in order按顺序将值插入sqlite数据库
【发布时间】:2016-04-07 06:50:46
【问题描述】:

我在 SQLITE 中有一个高分表,它支持三个简单的操作:

  1. 添加新用户及其高分。
  2. 更新现有用户的高分。
  3. 获取排行榜(所有用户和分数按分数排序):
    SELECT * FROM scores ORDER BY high_score DESC

一切正常,但我担心这会如何扩展:有 10,000 名用户排序高分大约需要 60 毫秒,这没关系,但这个时间大致呈线性上升,如果我有 100,000 名用户请求高分,则需要 ~ 600 毫秒太慢了。

是否有一种聪明的方法可以插入新用户/更新他们的分数,以避免每次检索排行榜时都必须进行完整的排序?例如。类似于 C++ priority_queue 或 python heapq。

我想我可以在每次插入时对整个数据库进行排序和替换(例如 Sort an entire SQLite table),但这似乎有点矫枉过正。

【问题讨论】:

  • 您是否在 arm 驱动的移动设备上使用 sqlite?
  • @st. - 不,在英特尔 Macbook Pro 上进行测试。

标签: database sqlite sorting


【解决方案1】:

如果您担心order byselect 中的性能,请创建索引。对于一个简单的查询,例如:

select s.*
from scores s
order by s.high_score desc;

您想要在scores(high_score) 上建立索引:

create index idx_scores_highscore on scores(high_score desc);

【讨论】:

  • 提供了巨大的加速,谢谢!最多数百次,具体取决于数据库的大小。在 python here 中使用演示的要点,以防它对任何人有用。
【解决方案2】:

排序/排序是在 SELECT 上完成的,而不是在 INSERT 上完成的。当查询未明确定义时,关系数据库不保证排序顺序。

一般而言,很可能在查询任何给定表时,您会按照插入记录的相同顺序取回记录,特别是如果主键是一个简单的自动递增数字,因为DB 可能会使用 PK 作为排序(如果它是聚集索引)。但不能保证。一旦你开始加入其他表,所有的赌注都没有了,因为数据库有更多的逻辑来优化那个查询。

基本上,如果您想按特定顺序取回记录,则必须在 SELECT 中指定该顺序。

如果存在性能问题,请分析您的查询并查找性能问题。排序列是否被索引?是否在某处执行全表扫描?还有什么问题吗?确定查询的执行计划并解决具体的瓶颈问题。

【讨论】:

    【解决方案3】:

    正如其他人所说,订购需要在“选择”部分完成。

    以下是一些性能提示:

    只查询您真正需要和关心的数据。如果不需要,不要选择所有列。如果您只对“前 20 名”左右感兴趣,请限制您的结果。

    缓存输出。这意味着:存储“选择”的结果并使缓存对表的更改无效。您也许可以使用触发器自动实现这一点,但在处理数据时“手动”执行它也应该很容易。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2012-09-09
      相关资源
      最近更新 更多