MySQL Benchmark - 测试的相关环境

 

且将新火试新茶 - MySQL Benchmark

公司内部最流行的数据库就是MySQL,而关于MySQL性能,我听过种种传说和流言。而对于数据库的性能优化和测试,我一直有强烈的兴趣,曾经见过一篇Oracle的性能优化文章,Linux JournalBert Scalzo所著的Linux Maximus, Part 1: Gladiator-like Oracle Performance,国人的翻译是《角斗士般的Oracle性能》[],那兄弟为了压榨Oracle的性能,从数据库的参数到操作系统的参数都进行了调整,最后得到的优化性能比开始提高了10多倍。为什么我用了压榨这个词,你可以想像将文件的最后修改时间调整为不可改变都可以提升数据库的性能。调整几个参数就可以使系统的能力如此提升,何乐而不为呢?

对于MySQL的性能,基本分成两种截然不同的声音:MySQL自己声称的性能数据是如此的优秀,超过Oracle等数据库若干倍等等。其实大多数公司进行的这样的对比测试都是不可信的,自己产品用专有接口,别人产品用出了名的慢接口ODBC,自己不用事务,别人用事务操作,这样的结果数据差距当然十万八千里。另外一种声音基本来之公司内部,主要质疑的是大数量下的性能,普遍的态度是认为在200000条记录以上,MySQL的性能将急剧下降。我个人是后一种观念的受害者,经常为了活动的开发还分表。最近有机会利用公司的设备资源,自己比较测试了若干种环境下的MySQL的表现,很多测试数据的结果颠覆了自己原来对MySQL的认识。

本文名为benchmark,但是实际是没有一个真正的基准,大部分测试是不同状况下的性能比较测试。如果非要找一个基准,那就是MySQL本身。

根据自己的疑惑,主要把测试的重点放在了MySQL不同版本间的性能比较,MySQL的查询缓存的性能,MySQLMyISAMInnoDB数据库引擎间性能比较,同时模拟了压力情况,真实环境测试性能,同时对于MySQL的新特性API接口STMT也进行了测试。在文档的最后,我给出了MySQL相关的优化参数说明以及MySQL的相关状态监控方法。

 

1         测试的相关环境

1.1         测试的机器

既然打着Benchmark的旗号,就必须介绍一下用于测试的机器。由于懒和想测试的用例是逐步的加入的,到测试结束,我耗费了将近6个月的时间。中间被我占用来测试的机器居然有4台,2种,HP 380G 3HP 380G 4 380G 4的机器配置上要好一些(虽然我感觉上表现和G4的基本相同),所以可能影响测试结果数据。而且在后期整理数据阶段,发现了很多测试数据偏差过大。我不得不怀疑机器有人同时使用造成了影响。

所幸我最后基本上把所有的测试用例在一台绝对空闲380G3上全部重做了一次。如果没有特别指明之处,大家就把测试机器看作内核是2.6.8.1(这个内核好像有些不完善.)的380G3吧。

其中模拟多表访问的测试是在另有一台2.4.21的内核的380G3测试了。为了保证对比的公平性,相关的比较都是相同机器上的测试数据。

                                                                                                                                                    表1 HP 380G 4HP 380G 3

 

CPU

MEM

DISK

HP 380G 4

CPU*2 3000M or 3200M Hz

4G ECC

SCSI RAID 5  36G *4

HP 380G 3

CPU*2 2800M Hz

2G ECC

SCSI RAID 5  73 G *4

两个的SCSI控制器好像都是Ultra 320 Smart Array 6i 64MB缓存)

 

1.2         测试的表

测试的表采用单键索引,主键为INT类型,记录类型覆盖了我们常用的记录类型,记录的长度为120多个字节,和我们平常的记录表类似。

CREATE TABLE IF NOT EXISTS benchmark.test1

(

F1      INT   NOT NULL ,

F2      INT   NOT NULL DEFAULT 0,

F3      INT   NOT NULL DEFAULT 0,

F4      INT   NOT NULL DEFAULT 0,

F5      INT   NOT NULL DEFAULT 0,

F6      INT   NOT NULL DEFAULT 0,

F7      INT   NOT NULL DEFAULT 0,

F8      INT   NOT NULL DEFAULT 0,

F9      INT   NOT NULL DEFAULT 0,

F10     INT   NOT NULL DEFAULT 0,

F11     FLOAT(10,4) NOT NULL DEFAULT 0,

F12     DOUBLE(10,4) NOT NULL DEFAULT 0,

F13     VARCHAR(64) NOT NULL DEFAULT “,    

F14     DATETIME   NOT NULL DEFAULT ‘0’,        

PRIMARY KEY (F1)

);

 

 

你可能感兴趣的:(oracle,数据库,mysql,测试,null,性能优化)