我在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
,但性能基本相同。
有没有更好的方法来编写查询和/或构建数据库以获得更快的执行时间?
答案 0 :(得分:2)
由于您有一个带有SQL查询的循环,您可以将其包装到事务中,这可以提高性能:
QSqlDatabase::database().transaction();
.........
// your loop
.........
QSqlDatabase::database().commit();
此外,通过添加索引可以提高性能。在您的案例中,可以在字段devices.addressid
和devices.ch
上创建索引。在sqlite控制台中执行以下操作:
CREATE INDEX devices_index ON devices(ch, addressid);
答案 1 :(得分:-1)
如果没有任何衡量标准或见解,addresses
和devices
表格看起来很难提供准确的建议。
也许连接是瓶颈所以你可以先尝试创建一个视图。这样可以避免连接两个表659000次。 See here on how to create a view.
接下来(在黑暗中拍摄),而不是执行660000个查询,进行批量处理。例如,将AND devices.ch = :chcode
替换为AND devices.ch IN(:chcodelist)
并将多个chcode粘合在一起。根据内容,照顾自己逃避。