C++ Qt-SQLite搜索查询速度

C++ Qt-SQLite搜索查询速度,c++,qt,sqlite,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 PRI

我正在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();
我需要多次访问此数据库(~660000次),通过
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();
问题是这个过程非常缓慢(完成所有66万次搜索几乎需要12分钟)

在此之前,我尝试了
内部连接
,但性能基本相同


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

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

QSqlDatabase::database().transaction();
.........
// your loop
.........
QSqlDatabase::database().commit();
此外,还可以通过添加索引来提高性能。在您的情况下,可以在
devices.addressid
devices.ch
字段上创建索引。在sqlite控制台中执行以下操作:

CREATE INDEX devices_index ON devices(ch, addressid);

如果没有任何测量或洞察,就很难给出准确的建议

可能连接是瓶颈,因此您可以尝试先创建一个视图。这样可以避免将两个表连接659000次


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

是否重复使用
prepare
d语句/查询?或者每次要搜索时都要运行
prepare
?是否有一个循环,在其中进行prepare和select操作?@phyatt我在循环中调用了一个函数,因此每次搜索时都要运行prepare,这对性能有显著影响吗?我甚至没想到那会是一场灾难problem@MichaelO. 我已经编辑了这个问题,我将prepare移到了循环之外,但是执行时间并没有改变。muchA事务只对写的语句有很大影响
(ch)
(ch,addressid)
会更好。我发现了问题,在创建
创建设备
查询时,我编写了
主键
,而不是
主键
,修复了打字错误,将执行时间缩短到了约1分钟。您的解决方案将时间缩短到约50秒,这对于我的应用程序来说是可以接受的,因此您的解决方案是最有用的