Qt SQLite搜索查询速度

时间:2017-06-08 14:52:21

标签: c++ qt sqlite

我在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次&#39,000次搜索需要将近12分钟)。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

CREATE INDEX devices_index ON devices(ch, addressid);

答案 1 :(得分:-1)

如果没有任何衡量标准或见解,addressesdevices表格看起来很难提供准确的建议。

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

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