MySQL 磁盘 I/O 问题

MySQL 磁盘 I/O 问题

参考

  • 《深入浅出 MySQL 全文》第 22 章 磁盘 I/O 问题

磁盘 I/O 问题

作为应用系统的持久化层,不管数据库采取了什么样的 Cache 机制,但数据库最终总是要将数据存储到可以长久保存的 I/O 设备上,但磁盘的存取速度显然
要比 CPU、RAM 的速度慢很多,因此,对于比较大的数据库,磁盘 I/O 一般总会称为数据库的一个性能瓶颈!

前面提到的 SQL 优化、数据库对象优化、数据库参数优化,以及应用程序优化,大部分都是想通过减少或延缓磁盘读写来减轻磁盘 I/O 的压力及其对性能的影响。
解决磁盘 I/O 问题,减少或延缓磁盘操作肯定是一个重要方面,但磁盘 I/O 是不可避免的,因此,增强磁盘 I/O 本身的性能和吞吐量也是一个重要方面。

使用磁盘阵列

RAID 是 Redundant Array of Inexpensive Disks 的缩写,翻译成中文就是 “廉价磁盘冗余阵列”,通常就叫做磁盘阵列。RAID 就是按照一定策略将数据
分布到若干物理磁盘上,这样不仅增强了数据存储的可靠性,而且可以提高数据读写的整体性能,因为通过分布实现了数据的 “并行” 读写。

常见 RAID 级别比较

RAID 级别特性优点缺点
RAID 0也叫条带化(Stripe),按一定 的条带大小(Chunk Size)将数 据依次分布到各个磁盘,没有 数据冗余数据并发读写速度快,无额 外磁盘空间开销,投资省数据无冗余保护,可靠性 差
RAID 1也叫磁盘镜像(Mirror),两个 磁盘一组,所有数据都同时写 入两个磁盘,但读时从任一磁 盘读都可以数据有完全冗余保护,只要 不出现两块镜像磁盘同时损 坏,不会影响使用;可以􏰁 高并发读性能容量一定的话,需要 2 倍 的磁盘,投资比较大
RAID 10是 RAID 1 和 RAID 0 的结合,也 叫 RAID 1+0。先对磁盘做镜像, 再条带话,使其兼具 RAID 1 的 可靠性和RAID 0的优良并发读 写性能可靠性高,并发读写性能优 良容量一定的话,需要 2 倍 的磁盘,投资比较大
RAID 4象 RAID 0 一样对磁盘组条带 化,不同的是:需要额外增加 一个磁盘,用来写各 Stripe 的 校验纠错数据RAID 中的一个磁盘损坏,其 数据可以通过校验纠错数据 计算出来,具有一定容错保 护能力;读数据速度快每个 Stripe 上数据的修改 都要写校验纠错块,写性 能受影响;所有纠错数据 都在同一磁盘上,风险大, 也会形成一个性能瓶颈; 在出现坏盘时,读性能会 下降
RAID 5是对 RAID 4 的改进:将每一个 条带(Stripe)的校验纠错数据 块也分布写到各个磁盘,而不 是写到一个特定的磁盘基本同 RAID 4,只是其写性 能和数据保护能力要更强一 点写性能不及 RAID 0、RAID 1 和 RAID 10,容错能力也不 及 RAID 1;在出现坏盘时, 读性能会下降

如何选择 RAID 级别

了解各种 RAID 级别的特性后,我们就可以根据数据读写的特点、可靠性要求,以及投资预算来选择合适的 RAID 级别,比如:

  • 数据读写都很频繁,可靠性要求也很高,最好选择 RAID 10;
  • 数据读很频繁,写相对较少,对可靠性有一定要求,可以选择 RAID 5;
  • 数据读写都很频繁,但可靠性要求不高,可以选择 RAID 0。

使用 Symbolic Links 分布 I/O

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于MySQL磁盘IO高的问题,可以尝试以下几种方法来解决:1.优化SQL语句,减少查询时间;2.增加MySQL缓存,提升系统性能;3.更换更快的硬盘,提高磁盘IO速度;4.调整MySQL参数,显著提升系统性能;5.使用读写分离,把读写操作分离出来;6.使用可靠的集群系统,提高系统的扩展性和可用性;7.使用SSD来加速磁盘的读取和写入速度。 ### 回答2: MySQL磁盘IO高的问题主要是由于大量的磁盘读写操作导致的。以下是解决MySQL磁盘IO高的几种方法: 1. 优化查询语句:检查和优化查询语句,尽量减少不必要的磁盘读取。可以使用索引,避免全表扫描,以提高查询效率。 2. 调整MySQL缓存:增大MySQL的缓冲区以减少对磁盘的读写操作。可以适当调整参数innodb_buffer_pool_size和key_buffer_size。 3. 分散磁盘IO请求:将数据、日志和临时表等分别存储在不同的物理磁盘上,以减少磁盘IO的竞争。 4. 增加内存:提升系统的物理内存,增加系统缓存,减少对磁盘的读写操作。 5. 使用SSD硬盘:使用SSD(固态硬盘)替换传统的机械硬盘,SSD硬盘具有更高的读写速度,能够显著提升磁盘IO性能。 6. 合理分区:对大表进行分区,将数据分散存储在多个分区上,减轻单个分区的IO负载。 7. 减少不必要的索引:评估并删除不再使用的索引,避免更新索引时的额外IO开销。 8. 使用缓存技术:可以考虑使用缓存技术,如Redis,将频繁读取的数据缓存到内存中,减少磁盘IO操作。 以上是解决MySQL磁盘IO高的一些方法,具体措施可以根据实际情况进行调整,以达到减少磁盘IO的目的。同时,也可以通过监控工具不断优化,以保持系统的高性能和稳定性。 ### 回答3: MySQL磁盘I/O高的情况可能是由于以下几个原因导致的:缓存不足、查询语句不优化、磁盘性能低等。 首先,可以尝试优化数据库的缓存设置。MySQL有一个用于缓存数据和索引的缓冲池(InnoDB缓冲池)。可以通过增加缓冲池的大小来减少对磁盘的访问次数,提高系统性能。 其次,需要优化查询语句,避免不必要的全表扫描和重复查询。可以使用索引来加快查询速度,同时避免在查询语句中使用大量的JOIN和子查询等操作,优化查询逻辑。 此外,可以考虑使用更高速的磁盘设备。当磁盘性能较低时,可以通过升级为更高速的磁盘设备或使用RAID等技术来提升磁盘性能,减少I/O等待时间。 另外,还可以使用MySQL的分区表功能来将大表拆分成较小的分区,减少单个分区上的磁盘访问压力,提高磁盘IO性能。 最后,可以通过调整MySQL的参数来优化磁盘I/O性能。例如,可以调整innodb_flush_method参数来控制MySQL数据的写入方式,选择适合的方式来提高磁盘I/O性能。 需要根据具体情况分析和综合考虑以上解决方案,并逐步尝试和优化,以降低MySQL磁盘I/O的负载,提高系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值