【问题标题】:Qt SQLite search query speedQt SQLite 搜索查询速度
【发布时间】:2017-06-08 14:52:20
【问题描述】:

我在 SQLite 中创建一个数据库如下:

QSqlQuery create_address;
create_address.prepare("CREATE TABLE addresses (addressid INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT UNIQUE)");
QSqlQuery create_devices;
create_devices.prepare("CREATE TABLE devices (ch TEXT PRIMARY KEY, addressid INTEGER REFERENCES addresses(addressid))");

create_devices.exec();
create_address.exec();

我需要访问这个数据库很多次(~660'000)传递ch并检索相应的地址,传递的ch不能在数据库中(返回空字符串)。

为此,我进行了以下查询

//outside loop
QSqlQuery find_address;
find_address.prepare("SELECT address FROM addresses,devices WHERE devices.addressid = addresses.addressid AND devices.ch = :chcode");

//in loop
find_address.bindValue(":chcode",QString::fromStdString(ch_code));

find_address.exec();

问题是这个过程非常慢(完成所有 660'000 次搜索需要将近 12 分钟)。

在此之前,我尝试使用INNER JOIN,但性能几乎相同。

有没有更好的方法来编写查询和/或构建数据库以获得更快的执行时间?

【问题讨论】:

  • 您是否重复使用prepared 语句/查询?还是每次要搜索时都运行prepare
  • 你有一个循环来准备和选择吗?
  • @phyatt 我在一个循环中调用的函数中有该语句,所以我每次搜索时都运行准备,这对性能有显着影响吗?我什至不认为这可能是一个问题
  • @MichaelO。我已经编辑了问题,我将准备移到了循环之外,但执行时间并没有太大变化

标签: c++ qt sqlite


【解决方案1】:

由于你有一个带有 SQL 查询的循环,你可以将它包装到事务中,这可能会提高性能:

QSqlDatabase::database().transaction();
.........
// your loop
.........
QSqlDatabase::database().commit();

还可以通过添加索引来提高性能。在您的情况下,可以在字段devices.addressiddevices.ch 上创建索引。在 sqlite 控制台中执行以下操作:

CREATE INDEX devices_index ON devices(ch, addressid);

【讨论】:

  • 一个事务只对写的语句有很大的影响。 (ch)(ch,addressid) 会好很多。
  • 我发现了问题,在创建create_devices 查询时我写了PRMARY KEY 而不是PRIMARY KEY,修复错字使执行时间缩短到约1 分钟。您的解决方案将其缩短到 ~50 秒,这对于我的应用程序来说是可以接受的,因此您的解决方案是最有帮助的
【解决方案2】:

如果没有任何衡量或洞察表 addressesdevices 看起来如何,很难给出准确的建议。

也许连接是瓶颈,所以您可以尝试先创建一个视图。这将避免连接两个表 659000 次。 See here on how to create a view.

接下来(在黑暗中拍摄),而不是执行 660000 个查询,而是进行批处理。例如,将AND devices.ch = :chcode 替换为AND devices.ch IN(:chcodelist) 并将多个chcode 粘合在一起。根据内容,照顾他们自己逃跑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2011-12-09
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多