gpt4 book ai didi

mysql - 使用 Qt/MySQL 批处理模式时的性能

转载 作者:可可西里 更新时间:2023-11-01 06:38:32 24 4
gpt4 key购买 nike

我正在使用 Qt 5.3.1(Win 7,VS2013)的 SQL 模块将数据插入 MySQL 5.6 数据库。在我注意到一些性能问题后,我执行了三个测试代码片段并测量了它们的运行时间,以更好地了解 SQL 性能。结果令人困惑。

为了测试,我使用了一个“测试”表,其中包含一个 VARCHAR 列“测试”和每行的唯一递增 ID。

第一个片段基本上是这样的:

const QString uploadQueryString("INSERT INTO test (test) VALUES ('%1')");
for (int i=0; i<1000; i++)
{
QSqlQuery uploadQuery(uploadQueryString.arg("A: test text"), dataBase);
if (uploadQuery.lastError().isValid())
{
qDebug() << tr("Query execution failed (%1)").arg(uploadQuery.lastError().text());
}
}

第二个像这样:

const QString uploadQueryString("INSERT INTO test (test) VALUES %1");

QStringList values;
for (int j=0; j<1000; j++)
{
values.append("\"B: test text\"");
}

QString valuesString = "("+ContainerToString(values, "), (")+")";

QSqlQuery uploadQuery(uploadQueryString.arg(valuesString), dataBase);
if (uploadQuery.lastError().isValid())
{
qDebug() << tr("Query execution failed (%1)").arg(uploadQuery.lastError().text());
}

第三个像这样:

const QString uploadQueryString("INSERT INTO test (test) VALUES (:values)");

QVariantList values;
for (int j=0; j<1000; j++)
{
values.append("C: test text");
}

QSqlQuery batchQuery(dataBase);
if (batchQuery.prepare(uploadQueryString))
{
batchQuery.bindValue(":values", values);

if (!batchQuery.execBatch())
{
qDebug() << tr("Batch query execution failed (%1)").arg(batchQuery.lastError().text());
}
}
else
{
qDebug() << tr("Unable to prepare batch query");
}

我对每个片段(包括打开/关闭代码)执行了 10 次:

1. 10x1000 basic inserts
Ticks delta: 318617 ms; Kernel delta: 358 ms; User delta: 1201 ms; Process delta 1559 ms

2. 10x1000 by value list insert
Ticks delta: 3011 ms; Kernel delta: 0 ms; User delta: 46 ms; Process delta 46 ms

3. 10x1000 by batch insert
Ticks delta: 631679 ms; Kernel delta: 811 ms; User delta: 998 ms; Process delta 1809 ms

“Ticks delta”是每个片段所需的时间。 "Kernel delta"和 "User delta"是实际活跃的用户和内核处理时间,而 "Process delta"是内核和用户时间的总和。

第一个结果如预期:执行 10x1000 单个查询需要大量时间(尤其是由于延迟)。

第二个结果也符合预期:一次包含所有行的单个查询执行速度非常快。

唉,第三个结果完全让我困惑:我期望批处理模式要快得多!即使在最坏的情况下(如果批处理执行是由驱动程序使用单个查询模拟的,如 Qt 文档所述),它也应该与第一个片段一样慢。事实上,它需要两倍的时间!

批处理在 Qt/MySQL 中实际上做了什么?有没有办法提高批量执行性能? execBatch() 的性能怎么可能比执行单个查询差得多?

最佳答案

QMYSQL 不支持 BatchExec。

您可以使用 QSqlDriver::hasFeature(QSqlDriver::BatchOperations) 来检查驱动程序是否支持 Batchexec。

也可以查看QT_SRC/src/sql/drivers/mysql/qsql_mysql.cpp中的源

bool QMYSQLDriver::hasFeature(DriverFeature f) const

它只是返回 false。

关于mysql - 使用 Qt/MySQL 批处理模式时的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25765111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com