2012-02-08 127 views
0

我正在使用100亿条记录的Sqlite数据库。我有多列排序的要求。为此,我在数据库上创建了复合索引,这些索引改进了性能,但是当我们颠倒排序顺序时,性能依然不佳,而不是索引中指定的顺序。 例如我创建了索引 创建索引StudentIDNAMEIndex ( SID DESC, NAME DESC );在SQLite中提高没有索引的ORDER BY的性能

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

+2

如果你有这么多的记录,也许你应该看看更重量级的数据库,如Oracle,MySQL,SQL Server或PostgreSQL? SQLite被设计为简单而干净,使得引入更难。我命名的其他DBMS被设计用于低错误计数**和**以获得优异的性能。 – 2012-02-08 06:14:14

+0

除了@AdamMihalcin的评论之外,值得指出的是,您不必为获得更重量级的数据库而付费,其中许多是免费的或者提供具有降低功能的免费版本(如SQL Server Express),这些免费版本这个任务的版本仍然比SQLite快得多 – Seph 2012-02-08 06:48:22

回答

4

整理一百万种东西正在整理一百万种东西。如果您没有按照您想要的顺序排序,只要需要对数据进行排序就会花费时间。

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

您应该更快地找到该表进行排序(因为整数比字符串比较快,并且在排序过程中丢弃的数据更少)。您仍可以加入原始文本数据的所有辅助表格。但是,如果您想要输入一个不在辅助表格中的新文本,您将需要做很多工作。而重构应用程序以使用这种结构需要很多工作。

这就是说我过去曾经使用这种设计,并且对只读操作的性能改进非常显着。然而,使其工作所需的工作也很重要。