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