【问题标题】:Improving performance of ORDER BY without indexes in SQLite在 SQLite 中提高无索引的 ORDER BY 的性能
【发布时间】:2012-02-29 14:33:02
【问题描述】:

我正在使用 100 万条记录的 Sqlite 数据库。我需要对多列进行排序。为此,我在数据库上创建了复合索引,这提高了 orderby 性能,但是当我们反转排序顺序而不是索引中指定的顺序时,性能仍然很差。 例如我创建了索引 创建索引 StudentIDNAMEIndex ( SID DESC, 名称描述 );

当我 ORDER BY SID ASC、NAME DESC 或任何其他组合时,ORDER BY 查询的性能会急剧下降。由于无法为每个组合添加索引,是否有另一种方法可以改进无索引或有效使用索引的排序?

【问题讨论】:

  • 如果你有这么多的记录,也许你应该看看更重量级的数据库,比如Oracle、MySQL、SQL Server或PostgreSQL? SQLite 被设计为简单而干净,使 bug 更难引入。我命名的其他 DBMS 专为减少错误数量而设计并且具有出色的性能。
  • 除了@AdamMihalcin 的评论,值得指出的是,您无需付费即可获得更重量级的数据库,许多是免费的或提供功能减少的免费版本(例如SQL Server Express),这些免费版本在完成这项任务时仍然比 SQLite 快得多

标签: sql performance sqlite indexing sql-order-by


【解决方案1】:

排序一百万件事就是排序一百万件事。如果您还没有按照您想要的顺序对它进行排序,它将需要对数据进行排序所需的时间。

也就是说,如果数据库是只读的,您可以通过以下大量工作来显着提高排序性能。获取每个文本列,并创建一个表,其中仅包含该列的值(按排序顺序)、升序 id 和 id 上的索引。在原始表中,将文本列替换为 id。最后你会得到一个包含一百万个条目的表格,每个条目只是一个数字 ID 列表。

您应该会发现此表的排序速度要快得多(因为整数的比较速度比字符串快,而且您在排序过程中要扔掉的数据更少)。您仍然可以连接到原始文本数据的所有辅助表。但是,如果您要输入一条不在辅助表中的新文本,您将有很多工作要做。重组应用程序以使用这种结构需要大量工作。

也就是说我过去使用过这种设计,并且只读操作的性能提升非常显着。然而,让它发挥作用所需的工作也很重要。

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多