Qt环境下,测试MySQL数据库单数据库单表写入数据的速率。

case 1: 单线程,单数据库连接。

for循环 分别采用10 100 1000 为单位块儿做处理。

case 2: 多线程,每个线程独自维护一个单数据库连接。

for循环 采用100 为单位块儿做处理。

实验结果:(在个人计算机下测试)

以10为单位,单线程输入10000行:Insert SQL need time : 59286(ms)

以100为单位单线程 Insert 10000 Lines to SQL need time : 5611(ms)

以1000为单位单线程 Insert 10000 Lines to SQL need time : 1027(ms)

以100为单位单线程Insert 102400 Lines to SQL need time : 67377(ms)

以1000为单位单线程Insert 102400 Lines to SQL need time : 10201(ms)

以100为单位10个多线程Insert 102400 Lines to SQL need time : 16200(ms)

结果分析:

方便实验观察,我所构造的待写入数据其单行数据量并不大,可认为是琐碎数据集。 (150字节以内)

可以看出,以10为单位与以100为单位时,耗时呈线性关系。 说明IO瓶颈并未达到,这时,for循环体内sql语句写入的行数越多,效率越高。

以100为单位与以1000为单位时,耗时不再线性的减小。说明在1000行一次的循环下,IO瓶颈已经限制数据的写入。htop工具查看下,66.6%的wa!

重复1024*100行的数据测试,同样有这样的结果。

当采用了10个线程,每个线程独立维护它的数据库连接,独立写入数据。可以看出,总时间明显减少!但耗时高于1000为单位的单线程。另查看数据库,发现其每一个threadnum相同的行数为100,然后threadnum会切换成其他线程。

综上,可以确认,MySQL 的Innodb型数据库是“行安全”的,线程中单条SQL语句视为原子执行块儿。同样是1024*100,多线程的处理没有1000为单位的单线程处理方式快,是由于多个线程的等待与切换浪费了部分时间。

Qt环境下,测试MySQL数据库在真实数据表项读写下,写入单表中数据的速率。

数据内容:

| id | taskseq | protocoltype | threadnumintask | idinthread | framesize | DestMac | SourMac | TypeorLength | Data | Upperlayer |
+----+---------+--------------+-----------------+------------+-----------+-------------------+-------------------+--------------+-------+------------+
| 1 | 1 | Ethernet | 2 | 1 | 544 | F8:0F:41:F3:61:00 | 00:E0:4C:40:01:32 | 08 00 | 45 00 00 22 00 00 40 00 3E 11 B1 C9 C0 A8 06 A6 C0 A8 03 0B DE 03 30 12 00 0E FF 47 34 31 33 39 00 08 00 00 00 00 00 00 00 00 00 00 00 00 | IP |

估计每行的数据量约300字节左右。

实验:在生产者消费者模型下,写入的速率。(在8核CPU下),for循环为10

case 1: 单线程单链接:写入102400行,耗时97630ms。速率约 18M/min

case 2: 10个线程,每个线程维护一个链接:写入102400行,耗时18830ms。 速率约为97.6M/min 或 1.5M/s