深入浅出MySQL 第22章 磁盘I/O问题

对于比较大的数据库,磁盘I/O 一般总会成为数据库的一个性能瓶颈

SQL优化,数据库对象优化,数据库参数优化,以及应用程序优化等,大部分都是想用过减少或延缓磁盘读来减轻磁盘I/O的压力及其对性能的影响.
解决磁盘I/O问题,减少或延缓磁盘操作是一重要方面,但磁盘I/O是不可避免的,因此,增强磁盘I/O本身的性能和吞吐量也是一个重要方面.
以下涉及到磁盘阵列,符号链接,裸设备等更底层的方面

1.磁盘阵列
RAID Redundant Array of Inexpensive Disks 翻译为’廉价磁盘冗余阵列’,也就是磁盘阵列.
RAID就是按照一定策略将数据分布到若干物理磁盘上
=>增强数据存储的可靠性,提高数据读写的整体性能(通过分布实现了数据的’并行’读写)

2.常见RAID级别及其特性

上
2

3.如何选择RAID级别
1.数据读写都很频繁,可靠性要求也很高,最好选择RAID 10;
2.数据读很频繁,写相对较少,对可靠性有一定要求,可以选择RAID 5;
3.数据读写都很频繁,但可靠性要求不高,可以选择 RAID 0;

4.虚拟文件卷或软RAID
模拟实现RAID的特性,利用操作系统中提供的软件包.

  1. 使用Symbolic Links (符号链接)分布I/O
    MySQL的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数datadir定义的目录下.这样如果不适用RAID 或逻辑卷,所有的表都存放在一个磁盘设备上,无法发挥多磁盘并行读写的优势!在这种情况下,我们可以利用操作系统的符号链接,将不同的数据库或表,索引指向不同的物理磁盘,从而达到分布磁盘I/O的目的

ps:使用Symbolic links存在一定的安全风险,如果不使用Symbolic links,应通过启动参数skip-symbolic-links禁用这一功能

6.禁止操作系统更新文件的atime属性
atime 是linux/unix 系统下的一个文件属性,每当读取文件时,操作系统都会将读操作发生的时间回写到磁盘上.对于读写频繁的数据库文件来说,记录文件的访问时间一般没有任何用处,却会增加磁盘系统的负担,影响I/O的性能!因此,可以通过设置文件系统的mount属性,阻止操作系统写atime信息,以减轻磁盘I/O的负担.
linux:
修改文件系统配置文件/etc/fstab,指定noatime选项

LABEL=/home /home ext3 noatime 1 2

然后重新mount文件系统

#mount -oremount /home

这样以后读/home 下文件就不会再写磁盘了

7.用裸设备(Raw Device) 存放InnoDB的共享表空间
MyISAM存储引擎有自己的索引缓存机制,但数据文件的读写完全依赖于操作系统,操作系统磁盘I/O缓存对MyISAM表的存取很重要.
但InnoDB存储一起拿与MyISAM不同,它采用类似Oracle的数据缓存机制来Cache索引和数据,操作系统的磁盘I/O缓存对其性能不仅没有帮助,甚至还有反作用.因此,在InnoDB缓存充足的情况下,可以考虑使用Raw Device来存放InnoDB共享表空间
raw device

猜你喜欢

转载自blog.csdn.net/qq_38802291/article/details/83112862