1.1 性能上的显著改变
1.1.1 MySQL5.5默认存储引擎的调整
在MySQL5.1.X之前的版本中,默认的存储引擎是MyISAM,每个MyISAM在磁盘上会将数据存储成三个文件。第一个文件是表结构文件,它的名字以表的名字开始,其扩展名会指出文件类型,为.frm文件存储表定义;第二个文件是数据文件,其扩展名为.MYD (MYData);第三个文件是索引文件,其扩展名是.MYI (MYIndex)。
MyISAM存储引擎的特点是表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是在大并发、重负荷生产系统上,表锁的特性显得有些力不从心,并且如果系统出现宕机、MySQLd进程崩溃,MyISAM引擎表很容易受到损坏,这时不得不用外部命令MyISAMchk去修复它。
从MySQL5.5.X开始,默认的存储引擎变更为InnoDB Plugin引擎。
InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级,并且也在SELECT语句提供一个与Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。之所以没有在InnoDB中扩大锁定的需要,是因为InnoDB中的行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY(外键)。在SQL查询中,你可以自由地将InnoDB类型的表与其他MySQL表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全整合到了MySQL服务器中,不过,为了能在主内存中缓存数据和索引,InnoDB存储引擎会维持它自己的缓冲池。InnoDB会在一个表空间中存储它的表和索引,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,在MyISAM表中,每个表是被存在分离的文件中的。另外,InnoDB 表可以是任何尺寸,即使是在文件尺寸被限制为2 GB的操作系统上。
InnoDB存储引擎应用在众多高压力、高并发的大型数据库站点上。比如,著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix, Inc.在InnoDB上存储着超过
1 TB的数据,还有一些其他站点在InnoDB上处理平均每秒800次插入/更新的负荷。
随着InnoDB存储引擎的崛起,更多公司为其提供了patch补丁,使其性能发挥至极致,包括Google公司、Percona公司、Sun Microsystems公司等,在MySQL5.1.X版本里,你可以自己选择是否加载打过补丁后的InnoDB Plugin(版本1.0.X),InnoDB Plugin较Built-in版本新增了很多特性,在后面会一一介绍,这里不再叙述。我之前用的MySQL5.1.43二进制版中,InnoDB Plugin已经包含在其/usr/local/MySQL/lib/plugin/目录下了,如图1-1所示。
修改my.cnf配置文件,采用InnoDB Plugin,添加如下内容:
ignore_builtin_innodb
plugin-load=innodb=ha_innodb_plugin.so;
innodb_trx=ha_innodb_plugin.so;
innodb_locks=ha_innodb_plugin.so;
innodb_lock_waits=ha_innodb_plugin.so;
innodb_cmp=ha_innodb_plugin.so;
innodb_cmp_reset=ha_innodb_plugin.so;
innodb_cmpmem=ha_innodb_plugin.so;
innodb_cmpmem_reset=ha_innodb_plugin.so
重启MySQL服务后,登录“MySQL>select @@innodb_version;”验证是否成功,这个是MySQL5.1的配置方法。
而在MySQL5.5.X版本里,你可以省去上面的那些操作步骤,直接修改my.cnf配置文件,添加如下内容即可:
innodb_file_per_table=1
innodb_file_format=barracuda
innodb_strict_mode=1
登录到MySQL里,执行下面命令验证是否成功。
MySQL> select @@version;
+-----------------+
| @@version |
+-----------------+
| 5.5.19 |
+-----------------+
1 row in set (0.00 sec)
MySQL> select @@innodb_version;
+----------------------------+
| @@innodb_version |
+----------------------------+
| 1.1.8 |
+----------------------------+
1 row in set (0.00 sec)
关于InnoDB Plugin配置介绍,参见MySQL5.5 手册:
在MySQL5.1里,Built-in InnoDB文件格式是Antelope,在MySQL5.5里InnoDB Plugin文件格式要调整为Barracuda。Barracuda格式支持表压缩功能,TRUNCATE TABLE的速度比以前要快。
图1-2和图1-3是官方提供的InnoDB和MyISAM的压力测试结果。
Sysbench是一个模块化、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。它主要包括以下几种方式的测试:
CPU性能
磁盘I/O性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
目前Sysbench主要支持 MySQL、PostgreSQL、Oracle 这3种数据库。下面来看看它的安装步骤。
首先,在 http://sourceforge.net/projects/Sysbench网站下载源码包。
接下来,按照以下步骤安装:
# tar zxvf Sysbench-0.4.8.tar.gz
# cd Sysbench-0.4.8
# . /configure
--with-MySQL-includes=/usr/local/MySQL/include
--with-MySQL-libs=/usr/local/MySQL/lib
# make && make install
在Sysbench 读和写及只读压力测试中,服务器分别采用了6、12、18、24、30、36核的CPU来进行对比,其并发连接数均设置为64。从图1-2和图1-3中可以看出,随着CPU核数的增加,InnoDB的吞吐量反而越好,反观MyISAM, 其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。由此,也说明了为什么在MySQL5.5.X版本中InnoDB被设置为默认的存储引擎。
下面附上官方InnoDB的参数:
--innodb_purge_threads=1
--innodb_file_format=barracuda
--innodb-buffer-pool-size=8192M
--innodb_support_xa=FALSE
--innodb_flush_method=O_DIRECT
--innodb-flush-log-at-trx-commit=2
--innodb-log-file-size=2000M
--innodb-log-buffer-size=64M
--innodb-io-capacity=200
--skip-innodb-adaptive-hash-index
--innodb-read-io-threads=8
--innodb-write-io-threads=8
--innodb_change_buffering=all
--innodb_stats_on_metadata=off
--innodb-buffer-pool-instances=12
--skip-grant-tables
--max_tmp_tables=100
--query_cache_size=0
--query_cache_type=0
--max_connections=1000
--max_prepared_stmt_count=1048576
--sort_buffer_size=32768
关于InnoDB Plugin介绍,请参考MySQL5.5手册: