前些时候对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的优势基本只剩下事务支持了。