性能优化不是一项简单的工作, 但也不是复杂的难事, 关键在于对InnoDB存储引擎特性的了解。 如果之前各章的内容读者已经完全理解并掌握了, 那就应该基本掌握了 如何使InnoDB存储引擎更好地工作。 本章将从以下几个方面集中讲解InnoDB存储引擎 的性能问题:
选择合适的CPU
内存的重要性
硬盘对数据库性能的影响
合理地设置RAID
操作系统的选择也很重要
不同文件系统对数据库的影响
选择合适的基准测试工具
9.1 选择合适的CPU
用户首先需要清楚当前数据库的应用类型。 一般而言, 可分为两大类: OLTP (Online Transaction Processing, 在线事务处理) 和OLAP (Online Analytical Processing, 在线分析处理)。 这是两种截然不同的数据库应用。 OLAP多用在数据仓库或数据集市中, 一般需要执行复杂的SQL语句来进行查询; OLTP多用在日常的事物处理应用中, 如银行交易、 在线商品交易、 Blog、 网络游戏等应用。 相对于OLAP,数据库的容量较小。
InnoDB存储引擎一般都应用于OLTP的数据库应用, 这种应用的特点如下:
用户操作的并发拭大
事务处理的时间一般比较短
查询的语句较为简单, 一般都走索引
复杂的查询较少
可以看出, OLTP的数据库应用本身对CPU的要求并不是很高, 因为复杂的查询可 能需要执行比较、 排序、 连接等非常耗CPU的操作, 这些操作在OLTP的数据库应用中较少发生。 因此, 可以说OLA P是CPU密集型的操作, 而OLTP是IO密集型的操作。 建议在采购设备时, 将更多的注意力放在提高IO的配置上。
从InnoDB存储引擎的设计架构上来看, 其主要的后台操作都是在一个单独的master thread中完成的, 因此并不能很好地支持多核的应用。 当然, 开源社区已经通过多种方法来改变这种局面, 而InnoDBl.0版本在各种测试下已经显示出对多核CPU的处理性能的支持有了极大的提高, 而lnnoDB 1.2版本又支持多个purge线程, 以及将刷新操作从 master thread中分离出来。 因此, 若用户的CPU支持多核, InnoDB的版本应该选择I.I或更高版本。 另外, 如果CPU是多核的, 可以通过修改参数innodb_read_io_ threads和innodb _write_ io _ threads来增大IO的线程, 这样也能更充分有效地利用CPU的多核性能。
9.2 内存的重要性
lnnoDB存储引擎既缓存数据, 又缓存索引, 并且将它们缓存于一个很大的缓冲池中, 即InnoDB Buffer Pool。 因此, 内存的大小直接影响了数据库的性能。
9.3 硬盘对数据库性能的影响
9.3.1 传统机械硬盘
传统机械硬盘最大的问题在于读写磁头,读写磁头的设计使硬盘可以不再像磁带一样,只能进行顺序访问,而是可以随机访问。但是,机械硬盘的访问需要耗费长时间的磁头旋转和定位来查找,因此顺序访问的速度要远高于随机访问。传统关系数据库的很多设计也都是在尽 盘充分地利用顺序访问的特性。
通常来说,可以将多块机械硬盘组成RAID来提高数据库的性能,也可以将数据文 件分布在不同硬盘上来达到访问负载的均衡。
9.3.2 固态硬盘
固态硬盘,更准确地说是基于闪存的固态硬盘,是近几年出现的新的存储设备,其内部由闪存(FlashMemory)组成。因为闪存的低延迟性、低功耗,以及防能性,闪存设备已在移动设备上得到了广泛的应用。企业级应用一般使用固态硬盘,通过并联多块闪存来进步提高数据传输的吞吐量。
不同于传统的机械硬盘,闪存是一个完全的电子设备。因此,固态硬盘不需要像传统机械硬盘一样,需要耗费大扯时间的磁头旋转和定位来查找数据,所以固态硬盘可以提供一致的随机访问时间。固态硬盘这种对数据的快速读写和定位特性是值得研究的。
另一方面,闪存中的数据是不可以更新的,只能通过扇区 (sector) 的覆盖重写,而在覆盖重写之前,需要执行非常耗时的擦除 (erase) 操作。擦除操作不能在所含数据的扇区 上完成,而需要在删除整个被称为擦除块的基础上完成,这个擦除块的尺寸大于扇区的大小,通常为 128KB 或者 256KB。此外,每个擦除块有擦写次数的限制。已经有 些算法来解决这个问题。但是对于数据库应用,需要认真考虑固态硬盘在写人方面存在的问题。
因为存在上述写入方面的问题,闪存提供的读写速度是非对称的。读取速度要远快于写入的速度,因此尽量避免过多的写入操作。
对于固态硬盘在InnoDB存储引擎中的优化,可以增加innodb_ io _ capacity变量的值达到充分利用固态硬盘带来的高IOPS特性。不过这需要用户根据自己的应用进行有针对性的调整。在InnoSQL及InnoDBl.2版本中,可以选择关闭邻接页的刷新,同样可以为数据库的性能带来一定效果的提升。
9.4 合理地设置RAID
9.4.1 RAID类型
RAID (Redundant Array of Independent Disks, 独立磁盘冗余数组)的基本思想就是把多个相对便宜的硬盘组合起来,成为一个磁盘数组,使性能达到甚至超过一个价格昂贵、容拭巨大的硬盘。由于将多个硬盘组合成为一个逻辑扇区,RAID看起来就像一个单独的硬盘或逻辑存储单元,因此操作系统只会把它当作一个硬盘。
RAID的作用是:
增强数据集成度
增强容错功能
增加处理量或容量
9.5 操作系统的选择
Linux是MySQL数据库服务器中最常使用的操作系统。 与其他操作系统不同的是Linux有着众多的发行版本, 每个用户的偏好可能不尽相同。 然而在将Linux操作系统作为数据库服务器时需要考虑更多的是操作系统的稳定性, 而不是新特性。