随着数据库的增长,SQLite 减速(滚动日志)

标签 sql performance sqlite database-performance

我在我的 c 应用程序中遇到大量 sqlite 减速问题,并且
不知道这是意料之中还是我没有正确使用 sqlite。
数据库使用滚动日志,如 http://dt.deviantart.com/journal/Build-Your-Own-Circular-Log-with-MySQL-222550965 中所述。 .

正在写入的表有大约 170 个浮点列,并设置为翻转
200 万行。插入行的查询如下所示:

INSERT OR REPLACE INTO table_name (row_id, <170 column names>) values ((SELECT
COALESCE(MAX(log_id), 0) % max_rows + 1 FROM table_name AS t), <170 floats>)

插入时间似乎随着行数线性增长。首先
插入需要不到一秒,而第 60,000 个需要 30 秒。是
这是你所期望的? db 存储在 ext3 格式的 SD 卡上
这是一个因素吗?

最佳答案

当您使用 MAX(log_id) ,您要求数据库找到 log_id 的最大值在表中。如果该列上没有索引,则确定最大值的唯一方法是扫描整个表。

您可以将索引添加到 log_id带有 SQL 命令的列,例如;

create unique index idx1 on table_name (log_id);

请注意,在一张特别大的 table 上,这可能需要一段时间。如果可以,请先在副本上尝试。

关于随着数据库的增长,SQLite 减速(滚动日志),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10343774/

相关文章:

sql - 将 FK/约束添加到表的子部分

sql 连接语法

mysql - 如何加快该查询(子选择)的执行速度?

c++ - 如何独立于所用机器测量性能

android - 如何在 sqlite 中将 2 列组合成一个新列

java - Android Sqlite 和外键失败

mysql - sql mysql 有值时返回列名

sql - 如何在postgresql中选择和平均表中的行

mysql - 哪些 mysql 设置会影响 LOAD DATA INFILE 的速度?

sql - 如何在 Sqlite 中找到两个变量之间的相关性?