INNODB:使用最广的存储引擎

innodb-buffer-pool-size

若是大部分是InnoDB表,那么InnoDB缓冲池或许比其余任何东西都更须要内存,InnoDB缓冲池缓冲的数据:索引、行数据、自适应哈希索引、插入缓冲、锁以及其余内部数据结构。InnoDB还使用缓冲池来帮助延迟写入,这样就能够合并多个写入操做,而后一块儿顺序写入,提高性能。总之,InnoDB严重依赖缓冲池,必须为其分配足够的内存。html

固然,若是数据量不大且不会快速增加,就没有必要为缓冲池分配过多的内存,把缓冲池配置得比须要缓存的表和索引还要大不少,实际上也没有什么意义。很大的缓冲池也会带来一些挑战,例如,预热和关闭都会花费很长的时间。若是有不少脏页在缓冲池里,InnoDB关闭时可能会花很长时间来把脏页写回数据文件。虽然能够快速关闭,可是在启动时须要作更多的恢复工做,也就是说咱们没法同时加速关闭和重启两个操做。当有一个很大的缓冲池,重启服务须要花费很长时间(几小时或者几天)来预热,尤为是磁盘很慢的时候,若是想加快预热时间,能够在重启后马上进行全表扫描或者索引扫描,把索引载入缓冲池。mysql

能够看到示例的配置文件中把这个值配置为12G,这不是一个标准配置,须要根据具体的硬件来估算。那如何估算?前面的小节,咱们说到,MySQL中最重要的缓存有5种,能够简单的使用下面的公式计算:sql

InnoDB缓冲池 = 服务器总内存 - OS预留 - 服务器上的其余应用占用内存 - MySQL自身须要的内存 - InnoDB日志文件占用内存 - 其它内存(MyISAM键缓存、查询缓存等)windows

具体来看,至少须要为OS保留1~2G内存,若是机器内存大的话能够预留多一些,建议2GB和总内存的5%为基准,以较大者为准,若是机器上还运行着一些内存密集型任务,好比,备份任务,那么能够为OS再预留多一些内存。不要为OS缓存增长任何内存,由于OS一般会利用全部剩下的内存来作文件缓存。缓存

通常来讲,运行MySQL的服务器不多会运行其余应用程序,但若是有的话,请为这些应用程序预留足够多的内存。安全

MySQL自身运行还须要一些内存,但一般都不会太大。须要考虑MySQL每一个链接须要的内存,虽然每一个链接须要的内存都不多,但它还要求一个基本量的内存来执行任何给定的查询,并且查询过程当中还须要为排序、GROUP BY等操做分配临时表内存,所以须要为高峰期执行大量的查询预留足够的内存。这个内存有多大?只能在运行过程当中监控。服务器

若是大部分表都是InnoDB,MyISAM键缓存配置一个很小值足矣,查询缓存也建议关闭。数据结构

innodb-log-file-size && innodb-log-files-in-group

若是对InnoDB数据表有大量的写入操做,那么选择合适的innodb-log-file-size值对提高MySQL性能很重要。InnoDB使用日志来减小提交事务时的开销。日志中记录了事务,就无须在每一个事务提交时把缓冲池的脏块(缓存中与磁盘上数据不一致的页)刷新到磁盘。事务修改的数据和索引一般会映射到表空间的随机位置,因此刷新这些变动到磁盘须要不少随机I/O。一旦日志安全的写入磁盘,事务就持久化了,即便变动尚未写到数据文件,在一些意外状况发生时(好比断电),InnoDB能够重放日志而且恢复已经提交的事务。并发

InnoDB使用一个后台线程智能地刷新这些变动到数据文件。实际上,事务日志把数据文件的随机I/O转换为几乎顺序地日志文件和数据文件I/O,让刷新操做在后台能够更快的完成,而且缓存I/O压力。async

总体的日志文件大小受控于innodb-log-file-size和innodb-log-files-in-group两个参数,这对写性能很是重要。日志文件的总大小是每一个文件的大小之和。默认状况下,只有两个5M的文件,总共10M,对高性能工做来讲过小了,至少须要几百M或者上G的日志文件。这里要注意innodb-log-files-in-group这个参数,它控制日志文件的数量,log group表示一个重作日志的文件集合,没有参数也没有必要配置有多少个日志组。

修改日志文件的大小,须要彻底关闭MySQL,而后将旧的日志文件迁移到其余地方,从新配置参数,而后重启。重启时须要将旧的日志迁移回来,而后等待MySQL恢复数据后,再删除旧的日志文件,请必定要查看错误日志,确认MySQL重启成功后再删除旧的日志文件。

想要肯定理想的日志文件大小,须要权衡正常数据变动的开销,以及崩溃时恢复须要的时间。

若是日志过小,InnoDB将必需要作更多的检查点,致使更多的日志写,在极个别状况下,写语句还会被拖累,在日志没有空间继续写入前,必须等待变动被刷新到数据文件。

另外一方面,若是日志太大,在崩溃时恢复就得作大量的工做,这可能增大恢复时间。InnoDB会采用checkpoint机制来刷新和恢复数据,这会加快恢复数据的时间,具体能够参考:

innodb-flush-log-at-trx-commit

前面讨论了不少缓存,InnoDB日志也是有缓存的。当InnoDB变动任何数据时,会写一条变动记录到日志缓存区。在缓冲慢的时候、事务提交的时候,或者每一秒钟,InnoDB都会将缓冲区的日志刷新到磁盘的日志文件。若是有大事务,增长日志缓冲区大小能够帮助减小I/O,变量innodb-log-buffer-size能够控制日志缓冲区的大小。一般不须要把日志缓冲区设置的很是大,毕竟上述3个条件,任一条件先触发都会把缓冲区的内容刷新到磁盘,因此缓冲区的数据确定不会太多,出入你的数据中有不少至关大的BLOB记录。一般来讲,配置1M~8M便可。

既然存在缓冲区,怎样刷新日志缓冲就是咱们须要关注的问题。日志缓冲必须刷新到磁盘,以确保提交的事务彻底被持久化。若是和持久化相比,更在意性能,能够修改innodb-flush-log-at-trx-commit变量来控制日志缓冲刷新的频率。

0:每1秒钟将日志缓冲写到日志文件并刷新到磁盘,事务提交时不作任何处理

1:每次事务提交时,将日志缓冲写到日志文件并刷新到磁盘

2:每次事务提交时,将日志缓冲写到日志文件,而后每秒刷新一次到磁盘

1是最安全的设置,保证不会丢失任何已经提交的事务,这也是默认的设置。0和2最主要的区别是,若是MySQL挂了,2不会丢失事务,但0有可能,2在每次事务提交时,至少将日志缓冲刷新到操做系统的缓存,而0则不会。若是整个服务器挂了或者断电了,则仍是可能会丢失一些事务。

innodb-flush-method

innodb-flush-method选项能够配置InnoDB如何跟文件系统相互做用。从名字上看,影响InnoDB怎么写读数据。windows和非Windows操做系统下这个选项的值是互斥的,也就是说有些值只能Windows下使用,有些只能在非Windows下使用,其中Windows下可取值:async_unbuffered、unbuffered、normal、Nosync与littlesync,非Windows取值:fdatasync、0_DIRECT、 0_DSYNC。

这个选项既会影响日志文件,也会影响数据文件,并且有时候对不一样类型的文件的处理也不同,致使这个选项有些难以理解。若是有一个选项来配置日志文件,一个选项来配置数据文件,应该会更好,但实际上它们混合在同一个配置项中。这里只介绍类Unix操做系统下的选项。

fdatasync

InnoDB调用fsync()和fdatasync()函数来刷新数据和日志文件,其中fdatasync()只刷文件的数据,但不包含元数据(好比:访问权限、文件拥有者、最后修改时间等描述文件特征的系统数据),所以fsync()相比fdatasync()会产生更多的I/O,但在某些场景下fdatasync()会致使数据损坏,所以InnoDB开发者决定用fsync()来代替fdatasync()。

fsync()的缺点是操做系统会在本身的缓存中缓冲一些数据,理论上双重缓冲是浪费的,由于InnoDB本身会管理缓冲,并且比操做系统更加智能。但若是文件系统能有更智能的I/O调度和批量操做,双重缓冲也并不必定是坏事:

有的文件系统和os能够累积写操做后合并执行,经过对I/O的重排序来提高效率、或者并发写入多个设备

有的还能够作预读优化,好比连续请求几个顺序的块,它会通知硬盘预读下一个块

这些优化在特定的场景下才会起做用,fdatasync为innodb-flush-method的默认值。

0_DIRCET

这个设置不影响日志文件而且不是全部的类Unix系统都有效,但至少在Linux、FreeBSD以及Solaris是支持的。这个设置依然使用fsync来刷新文件到磁盘,可是它彻底关闭了操做系统缓存,而且是全部的读和写都直接经过存储设置,避免了双重缓冲。若是存储设备支持写缓冲或预读,那么这个选项并不会影响到设备的设置,好比RAID卡。

0_DSYNC

这个选项使得全部的写同步,即只有数据写到磁盘后写操做才返回,但它只影响日志文件,而不影响数据文件。

建议:若是使用类Unix操做系统而且RAID控制器带有电池保护的写缓存,建议使用0_DIRECT,若是不是,默认值或者0_DIRECT均可能是最好的选择。

innodb-file-per-table

最后一个配置,说说InnoDB表空间,InnoDB把数据保存在表空间内,它本质上是一个由一个或者多个磁盘文件组成的虚拟文件系统。InnoDB表空间并不仅是存储表和索引,它还保存了回滚日志、插入缓冲、双写缓冲以及其余内部数据结构,除此以外,表空间还实现了不少其它的功能。能够经过innodb-data-file-path配置项定制表空间文件,innodb-data-home-dir配置表空间文件存放的位置,好比:

innodb-data-home-dir = /var/lib/mysql

innodb-data-file-path = ibdata1:1G;ibdata2:1G;ibdata3:1G

这里在3个文件中建立了3G表空间,为了容许表空间在超过了分配的空间时还能增加,能够像这样配置最后一个文件自动扩展

innodb-data-file-path =ibdata1:1G;ibdata2:1G;ibdata3:1G:autoextend

innodb-file-per-table选项让InnoDB为每张表使用一个文件,这使得在删除一张表时回收空间容易不少,并且特别容易管理,而且能够经过查看文件大小来肯定表大小,因此这里建议打开这个配置。

总结

MySQL有太多的配置项,这里没有办法一一列举,重要的是了解每一个配置的工做原理,从一个基础配置文件开始,设置符合服务器软硬件环境与工做负载的基本选项。

参考资料

做者:CHEN川

连接:https://www.jianshu.com/p/78b6b7e2bb7f

來源:简书

简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

mysql优化原理_【MySQL】我必须得告诉你们的MySQL优化原理3(下)INNODB配置相关推荐

  1. mysql sqlserver对比_很用心的写了 9 道 MySQL 面试题

    MySQL 一直是本人很薄弱的部分,后面会多输出 MySQL 的文章贡献给大家,毕竟 MySQL 涉及到数据存储.锁.磁盘寻道.分页等操作系统概念,而且互联网对 MySQL 的注重程度是不言而喻的,后 ...

  2. mysql拉荐_荐 一步一步教你MySQL主从复制读写分离

    本次我们通过docker搭建环境 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相互独立,有独立ip,互不冲突 Docker使用步 ...

  3. java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

    好程序员 Java 学习路线之 MySQL 的执行计划.什么是执行计划? 执行计划通常是开发者优化 SQL 语句的第一步. MySQL 在解析 SQL 语句时,会生成多套执行方案,然后内部会进行一个成 ...

  4. mysql ibata文件_重装系统后,怎么调用之前mysql的数据_mysql

    重装系统后,如何调用之前mysql的数据 前提是:必须保留之前的数据库数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数 ...

  5. mac 查看mysql是否安装_[简明核心系列] 三分钟Mac安装MySQL教程

    作者: @向三 高质量学习 QQ 群: 1021386120 自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章结构: 前言 安装 HomeBre ...

  6. 树莓派要mysql的密码_树莓派raspberry Pi 3B+系统中安装mysql过程中不提示输入密码,安装完后如何设置密码...

    树莓派raspberry Pi 3B+安装mysql未提示输入密码,安装后修改mysql密码默认密码 使用mysql -uroot -p 命令连接mysql时,报错 pi@raspberrypi:/ ...

  7. 怎么在linux上修改mysql端口映射_如何在Linux中更改默认的MySQL / MariaDB端口

    在本指南中,我们将学习如何更改MySQL / MariaDB数据库在CentOS 7和基于Debian的Linux发行版中绑定的默认端口. MySQL数据库服务器在Linux和Unix下运行的默认端口 ...

  8. 二级mysql教程下载_全国计算机等级考试教程:二级MySQL数据库程序设计

    第一章 数据库技术的基本概念与方法 1.1 基本概念 1.2 数据库系统的特点 1.3 数据库系统的结构 1.3.1 数据库系统的三级模式结构 1.3.2 三级模式结构的两层映像与两级数据独立性 1. ...

  9. linux mysql恢复数据_删库不跑路详解MySQL数据恢复

    作者:程淇铭 出处:https://segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,那么 ...

  10. mysql 热切换_热璞HotDB学习篇—如何基于MySQL进行数据高可用

    数据高可用之所以是老生常谈的话题,是因它对企业数据安全起到了至关重要的保障作用,数据高可用核心功能在于如何保证在发生故障时数据不丢失.本文作者热璞数据库HotDB首席架构师,精通数据库原理和MySQL ...

最新文章

  1. 人工智能和机器学习的基本实现过程总结
  2. 简单子串查找--strstr的使用(ZCMU1108)
  3. 51芯片4*4列阵按键c语言程序,单片机城中社稷.doc
  4. eclipse创建folder变成package解决方案
  5. wp8数据存储--独立存储文件 【转】
  6. 15M安装包就能玩《原神》,带你了解云游戏背后的技术秘密
  7. TurboMail邮件服务器帮你应付电子邮件归档危机
  8. 对称构型机器人轮直径校准思路
  9. 静态RAM(2K * 8位)6116介绍(抄自原理图)
  10. 复旦nlp实验室 nlp-beginner 任务一:基于机器学习的文本分类
  11. 【网络工程师】 H3C如何配置VLAN-trunk 二层隔离技术
  12. 语音识别之语音数据预处理
  13. 阿里云服务器搭建java环境详细步骤4
  14. Python 爬取网页数据的两种方法
  15. 港科百创 | 一清创新完成Pre-A+轮战略融资
  16. html中的图片路径ie8,IE8下文件上传时获取文件的真实路径
  17. End-to-end 3D Point Cloud Instance Segmentation without Detection
  18. uni-app学习之旅(二)uni-app开发规范
  19. 浙江大学机器学习(胡浩基)课程学习笔记一:概述与支持向量机
  20. 四.异常以及Cookie的处理

热门文章

  1. Pytest跳过执行之@pytest.mark.skip()详解大全
  2. 【Python爬虫】使用urllib.request下载已知链接的网络资源
  3. Python中的pip怎么配置环境变量
  4. 国内一些大公司的开源项目
  5. 2018-2019-1 20165221 《信息安全系统设计基础》第一周学习总结
  6. 计算机基础:计算机网络-socket编程
  7. 2.apache模块mod_rpaf ,让nginx代理后端的apache获取访客真是IP
  8. Oil Deposits
  9. Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll
  10. jquery 判断控件css样式,jQuery获取并设置CSS类