Mysql insert 数据性能测试

前些时候对Mysql做了些测试,得到了一些测试数据。网上看到一些Mysql相关总结,并不能一味相信,还是需要看数据说话。

下面的测试用例都是插入1千万条数据,分别对三种类型的数据表类型进行测试(MYISAM,INNODB,NDB),测试用例是:

NDB是官方的集群部署版本,测试数据是基于6.x。Mysql proxy也是官方的,用的好像是0.8.x版本,做过负载均衡,读写分离测试,负载均衡比较稳定,但是读写分离在多线程下则非常不稳定。
1.MYISAM类型数据表的单线程
2.INNODB类型数据表的单线程,开启innodb_flush_log_at_trx_commit
3.INNODB类型数据表的单线程,关闭innodb_flush_log_at_trx_commit
4.MYISAM 100线程、100连接池
5.INNODB 100线程、100连接池,NO LOG
6.MYISAM 1000线程、1000线程池
7.INNODB 1000线程、1000线程池
8.NDB类型数据表(3NODE、3份冗余),单线程, 使用Mysql proxy负载均衡
9.NDB(3NODE、3冗余),100线程,100连接池,使用Mysql proxy
10.NDB(3NODE、3冗余),1000线程,1000连接池,使用Mysql proxy

测试结果总结:

性能测试 -mysql insert性能测试">

•横坐标为数据量,纵坐标为时间,单位毫秒。用来泡测试用例的机器性能比较次,开启2000个线程后就跑不动了。
•测试用例并没有用到事务,所有测试Insert内容为 10个varchar(255)字段,插入内容为10个32位的 uuid,除了主键没有建立其它索引。
•测试都是跑在虚拟机上的,NDB类型由于考虑虚机共享网卡和CPU原因,是三台独立的宿主机。
•MYISAM在压力测试下优势非常明显,最下面一条线是100线程的,仅次于的是1000线程的,而且性能基本是线性的。

•INNODB测试首先要看  innodb_flush_log_at_trx_commit 这个条件,开启log的性能在单线程下差点垫底。
•INNODB在关闭Log后,性能倒是可以接受,但是大压力下性能有明显的下降,且称不上线性。
•NDB数据时放在内存中的,再加上设置了3分冗余量,默认配置的内存很快就被消耗干净了,需要手动设置一下使用内存大小。目测数据冗余的建立是同步的。
•NDB数据由于都是放在内存中的,原以为测试性能不会太差。NDB在单线程下则是垫底的,可能Proxy对性能有一定的影响,不过好消息是100线程和1000线程在图上的表现基本是重合的。

Mysql相关的技术非常丰富,五花八门,基本上我能想到的网上都能找到相关方案。但是在云计算时代,可能需要顾及向下兼容,则没有特别的方案能解决数据一致性、高负载、冗余灾备和海量数据等问题。从insert来看,用MongoDB测试了单线程下的1千万数据,速度是Mysql的3倍,基于存储原理(MongoDB将索引放在内存中)估计select性能差距会更大。越来越多的非关系型数据库在这些方面越来越成熟,Mysql的优势基本只剩下事务支持了。

时间: 2024-11-05 23:31:22

Mysql insert 数据性能测试的相关文章

Mysql INSERT数据并返回返回自增ID

如何返回插入一条数据,该数据自增ID的ID号? PHP 函数 mysql_insert_id() 是返回在最后一次执行了 INSERT 查询后,由 AUTO_INCREMENT 定义的字段的值.  示例代码  代码如下 复制代码 <?php $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) {     die('Could not connect: ' . mysql_error());

mysql insert 插入数据教程

当数据放入一个MySQL表是被称为插入数据.当插入数据,重要的是要记住的确切名称和类型的表的列.如果您尝试建立一个500字作文成为一个栏只接受整数的大小3 ,您会结束了一个讨厌的错误! insert 数据到您的表 现在您已经建立您的表格,让我们把一些数据的小狗!这是在PHP / MySQL的代码插入的数据为"榜样"我们创建表在过去的教训. <?php // Make a MySQL Connection mysql_connect("localhost", &

mysql insert语句后如何获取insert数据的主键值自动编号

关于mysql教程 insert语句后如何获取insert数据的主键值自动编号呢, 方法很简单的,mysql数据自带的了mysql_insert_id ( );函数 使用方法: insert into(a')values('b') $nid = mysql_insert_id ( ); 方法二: LAST_INSERT_ID(),不过关于这个函数,与mysql_insert_id()比较有很多的区别,mysql_insert_id ()是直接获取当前session的insert_id,而LAST

如何优化MySQL insert性能

对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长.我们就有一个业务系统,每天的数据导入需要4-5个钟.这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情.因此,提高大数据量系统的MySQL insert效率是很有必要的. 经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考. 1.一条SQL语句插入多条数据. 常用的插入语句如: INSERT INTO `insert_table` (`datetim

小技巧:用批处理对MySQL进行数据操作

mysql|技巧|数据     批处理是一种非交互式运行mysql程序的方法,如同您在mysql中使用的命令一样,你仍然将使用这些命令. 为了实现批处理,您重定向一个文件到mysql程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在mysql中输入的命令相同的文本. 比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾): USE Meet_A_Geek; INSE

教你实现MySQL表数据迁移自动化

一.背景 之前我写过关于SQL Server的数据迁移自动化的文章:SQL Server 数据库迁移偏方,在上篇文章中设计了一张临时表,这个临时表记录搬迁的配置信息,用一个存储过程读取这张表进行数据的迁移,再由一个Job进行迭代调用这个存储过程. 在这次MySQL的实战中,我的数据库已经做了4个分片,分布在不同的4台机器上,每台机器上的数据量有1.7亿(1.7*4=6.8亿),占用空间260G(260*4=1040G),这次迁移的目的就是删除掉一些历史记录,减轻数据库压力,有人说这为什么不使用表

MySQL改善数据装载操作效率的策略

[导读]本文介绍MySQL改善数据装载操作效率的策略.多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当.相对来说,将数据装入数据库是直截了当的. 多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当.相对来说,将数据装入数据库是直截了当的.然而,也存在可用来改善数据装载操作效率的策略,其基本原理如下: 成批装载较单行装载更快,因为在装载每个记录后,不需要刷新索引高速缓存:可在成批记录装入后才刷新. 在

php 在线导入mysql大数据程序

 php 在线导入 mysql 大数据程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 <?php header("content-type:text/html;charset=utf-8"); e

mysql-JDBC连接MySQL插入数据问题

问题描述 JDBC连接MySQL插入数据问题 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); PreparedStatement sqlStmt =null; String Email=request.getParameter("Email"); String Passwo