1. 磁盘I/O问题
作为应用系统的持久化层,不管数据库采取了什么样的 Cache 机制,但数据库最终总是要将数据储存到可以长久保存的I/O设备──磁盘上,但磁盘的存取速度显然要比CPU、RAM 的速度慢很多,因此,对于比较大的数据库,磁盘 I/O 一般总会成为数据库的一个性能瓶颈!
我们前面提到的 SQL 优化、数据库对象优化、数据库参数优化,以及应用程序优化等,大部分都是想通过减少或延缓磁盘读写来减轻磁盘 I/O 的压力及其对性能的影响。解决磁盘 I/O 问题,减少或延缓磁盘操作肯定是一个重要方面,但磁盘 I/O 是不可避免的,因此,增强磁盘 I/O 本身的性能和吞吐量也是一个重要方面。
1.1 使用磁盘阵列
1.2 使用Symbolic Links分布I/O
MySQL 的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数 datadir 定义的目录下。这样如果不使用 RAID 或逻辑卷,所有的表都存放在一个磁盘设备上,无法发挥多磁盘并行读写的优势!在这种情况下,我们就可以利用操作系统的符号连接(Symbolic Links)将不同的数据库或表、索引指向不同的物理磁盘,从而达到分布磁盘 I/O 的目的。
(1)将一个数据库指向其他物理磁盘
(2)将MyISAM(其他存储引擎的表不支持)表的数据文件或索引文件指向其他物理磁盘。
(3)在Windows下使用符号连接。
1.3 禁止操作系统更新文件的atime属性
atime 是 Linux/UNIX 系统下的一个文件属性,每当读取文件时,操作系统都会将读操作发生的时间回写到磁盘上。对于读写频繁的数据库文件来说,记录文件的访问时间一般没有任何用处,却会增加磁盘系统的负担,影响 I/O 的性能!因此,可以通过设置文件系统的 mount属性,阻止操作系统写 atime 信息,以减轻磁盘 I/O 的负担。
1.4 用裸设备(Raw Device)存放InnoDB的共享表空间
MyISAM 存储引擎有自己的索引缓存机制,但数据文件的读写完全依赖于操作系统,操作系统磁盘 I/O 缓存对 MyISAM 表的存取很重要。但 InnoDB 存储引擎与 MyISAM 不同,它采用类似 Oracle 的数据缓存机制来 Cache 索引和数据,操作系统的磁盘 I/O 缓存对其性能不仅没有帮助,甚至还有反作用。因此,在 InnoDB 缓存充足的情况下,可以考虑使用 Raw Device 来存放 InnoDB 共享表空间。