MySQL的优化都是基于对IO的优化

1,155 阅读2分钟

1. 前言

之前凭着一腔热血在极客时间买了一大堆课程,其中某些课程看了部分章节就放弃了,某些课程可能压根就没有打开过。最近有时间,开始了《MySQL实战45讲》的学习,学习期间遇到了很多不懂的知识点,通过查看评论以及查阅资料,算是搞懂了,最后自己也对MySQL优化部分进行了一个梳理,构成此篇文章。

2.优化

MySQL优化用一句话总结:就是对磁盘IO进行优化,不信你可以看看下面内容

2.1 buffer_pool_size

buffer_pool_size参数用于设置缓冲池大小,缓冲池越大,存放的数据页也就越多。执行一次查询,查询数据对应的数据页在内存中,就可以直接返回,不需要进行IO操作,直接在内存中完成,其性可想而知。

关于buffer_pool_size大小设置,官方文档是这么建议的:

On dedicated servers, up to 80% of physical memory is often assigned to the buffer pool.

2.2 redo log

执行一次写操作,写内存、写redo log,为什么要写redo log不直接写磁盘呢?因为写redo log是顺序写IO,写磁盘是随机写IO,顺序IO性能优于随机IO。结论:redo log的存在使用顺序写IO替代随机写IO

2.3 change buffer

执行一次写操作,对应数据的数据页不在内存中,写change buffer、写redo log,写change buffer避免将数据页读入内存,减少随机读IO。结论change buffer的存在为了减少随机读IO

2.4 索引

一条语句执行慢,第一本能反应就是加索引,加索引可以走索引树搜索,避免全表扫描,也就是减少IO次数。结论:索引的存在是为了减少IO次数

2.4.1 覆盖索引

使用二级索引就可以得到查询结果,称之为用到覆盖索引覆盖索引避免了在聚簇索引树上的搜索,也就是减少了IO次数。结论:覆盖索引的存在是为了减少IO次数

2.4.2 索引下推

在回表前使用组合索引中的条件进行过滤,减少回表IO次数。结论:索引下推的存在是为了减少IO次数

2.4.3 MRR

MRR在回表前会对主键进行排序,将随机读IO变成顺序读IO。结论:MRR的存在是为了将随机读IO变成顺序读IO

3.结论

以上所有手段方式,都是基于IO进行优化:

  • 减少随机读IO
  • 顺序写IO替代随机写IO
  • 减少了IO次数
  • 随机读IO变成顺序读IO

因此在对MySQL进行优化的时候,可以多往IO上面靠靠,取得的效果应该不会太差。