mysql 默认page大小_MySQL innodb_page_size

原标题:MySQL innodb_page_size

墨墨导读:Page是MySQL Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,了解page的一些特性,可以更容易理解MySQL。

innodb_page_size作为innodb和OS交互单位。文件系统对文件的buffer IO,也是page为单位进行处理的。Linux的默认page的大小4096字节,当要将数据写入到文件的时候,会先在内存里,然后将对应的page cache,整个的从内存刷到磁盘上。但是如果要写入的文件区域,因为还没有被缓存或者被置换出去了等原因,在内存里不存在对应的page cache,则需要先将对应page的内容从磁盘上读到内存里,修改要写入的数据,然后在将整个page写回到磁盘;在这种情况下,会有一次额外的读IO开销,IO的性能会有一定的损失。假如mysql的16K的页表数据支持起,那就是一次内存IO光是虚拟地址到物理地址的转换就要去内存查4次页表,再算上真正的内存访问,需要5次内存IO才能获取一个内存数据。

操作系统PAGE:

在操作系统层面,每个进程都有自己独立的地址空间,看到的都是操作系统虚拟出来的地址空间,虚拟地址最终还是要落在实际内存的物理地址上进行操作的。操作系统就会通过页表的机制来实现进程的虚拟地址到物理地址。其中每一页的大小都是固定的。

获取当前操作系统的page size:

####X86:

[root@ens8 ~] # getconf PAGESIZE

4096

####ARM:

root@ens8ARM :~# getconf PAGESIZE

65536

页表级数:

页表级数越少,虚拟地址到物理地址的映射会很快,但是需要管理的页表项会很多,能支持的地址空间也有限。

相反页表级数越多,需要的存储的页表数据就会越少,而且能支持到比较大的地址空间,但是虚拟地址到物理地址的映射就会越慢。

备注:ARM系统来说需要编译指定才可以。因为Linux 默认4kb页是通过长期的跟MySQL磨合,才有现在的稳定的表现。

MySQL数据库Page

InnoDB逻辑存储单元主要分为表空间、段、区和页。层级关系为tablespace -> segment -> extent(64个page,1M) -> page。(非常经典的图)

8720819bd0c6ee05e8215474a39095ba.png

在看看innodb_page_size的官方描述:

dcb3d2b903a27f23fd4e02c28fd3d6b4.png

第一个系统表空间数据文件(ibdata1)的最小文件大小取决于innodb_page_size值

innodb_page_size只能在初始化MySQL实例之前配置,不能在之后修改。如果没有指定值,则使用默认页面大小初始化实例。

MySQL 5.7增加了对32KB和64KB页面大小的支持。对于32KB和64KB的页面大小,最大行长度约为16000字节。当innodb_page_size设置为32KB或64KB时,不支持ROW_FORMAT= compression。对于innodb_page_size=32k,区段大小为2MB。对于innodb_page_size=64KB,区段大小为4MB。当使用32KB或64KB的页面大小时,innodb_log_buffer_size应该至少设置为16M(默认)。

默认的16KB或更大的页面大小适用于各种工作负载,特别是涉及表扫描的查询和涉及批量更新的DML操作。对于涉及许多小写操作的OLTP工作负载,较小的页面大小可能更有效,在这种工作负载中,当单个页面包含许多行时,可能会出现争用问题。对于通常使用较小块的SSD存储设备,较小的页面也可能是有效的。保持InnoDB页面大小接近存储设备块大小,可以最大限度地减少被重写到磁盘的未更改数据量.

对于row,index,tablesapce的影响

Page对Row的影响:

对于4KB、8KB、16KB和32KB的页大小,最大行大小(不包括存储在页外的任何可变长度的列)略小于页大小的一半。例如,默认innodb_page_size为16KB的最大行大小约为8000字节。然而,对于InnoDB页面大小为64KB的页面,最大行大小大约是16000字节。LONGBLOB和LONGTEXT列必须小于4GB,包括BLOB和文本列在内的总行大小必须小于4GB。

Page对index的影响:

如果在创建MySQL实例时通过指定innodb_page_size选项将InnoDB页面大小减少到8KB或4KB,索引键的最大长度将按比例降低,这是基于16KB页面大小的3072字节限制。也就是说,当页面大小为8KB时,最大索引键长度为1536字节,而当页面大小为4KB时,最大索引键长度为768字节。

不同的Page大小,表空间限制:

1e08e849b859198d6e8d60a6180658db.png

Pages对字段的影响 :

对于4KB、8KB、16KB和32KB的innodb_page_size设置,最大行长度略小于数据库页的一半。例如,对于默认的16KB InnoDB页面大小,最大行长度略小于8KB。对于64KB的页面,最大行长度略小于16KB。

如果一行不超过最大行长度,则所有行都存储在本地页中。如果一行超过最大行长,则选择可变长度列用于外部页外存储,直到该行符合最大行长限制为止。可变长度列的外部离页存储因行格式不同而不同:

COMPACTRow Formats:

当一个可变长度的列被选择用于外部页外存储时,InnoDB将前768个字节本地存储在行中,其余的存储在外部溢出的页面中。每个这样的列都有自己的溢出页列表。768字节的前缀伴有一个20字节的值,该值存储列的真实长度,并指向存储其余值的溢出列表

DYNAMICRow Formats:

当一个可变长度的列被选择用于外部页外存储时,InnoDB在本地的行中存储一个20字节的指针,其余的则在外部存储到溢出的页面中,LONGBLOB和LONGTEXT列必须小于4GB,包括BLOB和TEXT列在内的总行长度必须小于4GB。

Page如何计算记录数

page构成结构:

5c86bf9a770df90c1d88e3bf61ed1d8d.png

除数据外ROW额外信息存在哪些:

45fc42577825af330d95c8fb7b24aac4.png

16k页为基准,能保存多少记录数:

按照上面Page结构图,可以如下计算:

1.page大小(16*1024=16384)- 必要信息(File Header38字节+page header56字节+虚拟最大最小记录26字节+Page Directory4字节+File Trailer8字节)=16252字节

2.约每4条记录占用一个slot,一个slot大小占用2字节

3.row header(5字节+可变长+非空占位符)+ 主键key长度(如果没有显示声明默认会创建6字节row id)+ trxid6字节+ rollptr7字节

4.假如单行长度计算公式为:row header5字节 + 主键索引列4字节 + 指针4字节 = 13字节

单个page最多能容纳最多行数为 单行长度N+N/4*2 = 16252,

N为1203测试:

526eaaf31770a2ee5ec82b52e251d075.png

9776108d771066449041e30041eeae45.png

通过sysben压测,发现MySQL默认页16K 相比8K 对CPU压力较小,但8k页的情况下所有指标都会有所提升。

sysbench压测是基于主键,8k的页来说,行小于4k的数据来说性能提升,假如大于4k的数据,性能肯定会有下降,因为会出现行溢出,会导致读取列需要多一个IO。所以不同的业务场景可以有效的调整innodb page size 进行调试。当然硬件也要支持,传统的SAS硬盘会存在IO效率下降,更上一层的硬盘(SSD,PCIE)能提供更高的IOPS。

总结

那么innodb_page_size的如何设置,按照个人理解,生产环境中,可以选择16kb 和8kb的长度。

可以考虑一下方面:

1.遵守单行略小于页大小的一半。不能发生行溢出现象,随之而来的要求是尽量主键操作,分配跟多的内存

2.硬件设备的支持,很多高端服务器cpu使用率也就在30%以内的服务器,完全可以使用8kb,提高整体性能。

innodb_page_size设置问题,最终还是io性能方面的优化。需要有效的利用MySQL的一些特性(索引组织表,尽量走主键避免回表,尽量减少随机读写等)结合实际情况进行配置。

前几天一起工作的同事聊到,现在出现新的高端内存。又能放到内存,又能保存数据的内存条!

墨天轮原文链接:https://www.modb.pro/db/40387(复制到浏览器中打开或者点击“阅读原文”)返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 266. 回文排列(计数)

文章目录1. 题目2. 解题1. 题目 给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。 示例 1: 输入: "code" 输出: false示例 2: 输入: "aab" 输出: true示例 3: 输入…

LeetCode 1150. 检查一个数是否在数组中占绝大多数(二分查找)

文章目录1. 题目2. 解题2.1 暴力2.2 二分查找1. 题目 给出一个按 非递减 顺序排列的数组 nums,和一个目标数值 target。 假如数组 nums 中绝大多数元素的数值都等于 target,则返回 True,否则请返回 False。 所谓占绝大多数,是指…

VirtualBox的Linux虚拟机访问Windows7的文件

第一步: 安装 VirtualBox 增强工具 点击确定,稍等片刻,VirtualBox 的增强功能就可以安装完毕。 第2步:设置要共享给Linux 虚拟机的文件夹(目录) 点击右下角的“分配数据空间” 点击“添加” 选择要共享的路…

LeetCode 1118. 一月有多少天(闰年判断)

文章目录1. 题目2. 解题1. 题目 指定年份 Y 和月份 M,请你帮忙计算出该月一共有多少天。 示例 1: 输入:Y 1992, M 7 输出:31示例 2: 输入:Y 2000, M 2 输出:29示例 3: 输入&am…

vue warning如何去掉_详解 vue 组件三大核心概念

前言本文主要介绍属性、事件和插槽这三个vue基础概念、使用方法及其容易被忽略的一些重要细节。如果你阅读别人写的组件,可以从这三个部分展开,它们可以帮助你快速了解一个组件的所有功能。本文的代码请猛戳https://github.com/ljianshu/Blog&#xff0c…

LeetCode 1133. 最大唯一数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 A,请找出并返回在该数组中仅出现一次的最大整数。 如果不存在这个只出现一次的整数,则返回 -1。 示例 1: 输入:[5,7,3,9,4,9,8,3,1] 输出:8 解释: 数组…

技术演讲的技巧和经验

导读:如果你在编程大会上发表演讲,不论是开放式的BarCamp或是像OSCON那样精心组织的大型会议,你只有很短的一段时间将脑中的信息传达给听众,所以请仔细把握。 技术会议的成本非常昂贵,不仅仅是经济上的成本。即使像Bar…

如何使用kali来进行一次ddos攻击

本文章用于记录自己的学习路线,不用于其他任何途径! ! ! 哈喽啊!又是好久不见,本博主在之前发过一个ddos攻击的介绍。 emm…虽然那篇文章也提到了ddos攻击的方式,但太过于简陋,好像也没有什么用,so&#…

LeetCode 256. 粉刷房子(DP)

文章目录1. 题目2. 解题1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同&…

LeetCode 1099. 小于 K 的两数之和(二分查找)

文章目录1. 题目2. 解题2.1 暴力2.2 二分查找1. 题目 给你一个整数数组 A 和一个整数 K,请在该数组中找出两个元素,使它们的和小于 K 但尽可能地接近 K,返回这两个元素的和。 如不存在这样的两个元素,请返回 -1。 示例 1&#…

sonarqube使用mysql_SonarQube的安装、配置与使用

SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装、配置以及使用。准备工作;1、jdk(不再介绍)2、sonarqube:http://www.sonarqube.org/downloads/3、SonarQubeScan…

windows phone7 学习笔记14——地理位置服务与反应性扩展框架

使用Location Service能帮助开发者为windows Phone 开发具备位置感知(Location-Aware)功能的应用程序。比如很多导航的软件,查找附近吃饭、娱乐甚至厕所的应用程序,都是基于这个服务的。 我们有3种方法来获取设备的位置。GPS,移动…

LeetCode 1228. 等差数列中缺失的数字

文章目录1. 题目2. 解题1. 题目 有一个数组&#xff0c;其中的值符合等差数列的数值规律&#xff0c;也就是说&#xff1a; 在 0 < i < arr.length - 1 的前提下&#xff0c;arr[i1] - arr[i] 的值都相等。 我们会从该数组中删除一个 既不是第一个 也 不是最后一个的值…

离散系数的计算公式_如何求不同变量之间的离散程度

变异系数前面介绍的极差、方差和标准差都是反映一组数值变异程度的绝对值&#xff0c;其数值的大小&#xff0c;不仅取决于数值的变异程度&#xff0c;而且还与变量值水平的高低、计量单位的不同有关。所以&#xff0c;不宜直接利用上述变异指标对不同水平、不同计量单位的现象…

LeetCode 252. 会议室(排序)

文章目录1. 题目2. 解题1. 题目 给定一个会议时间安排的数组&#xff0c;每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei)&#xff0c;请你判断一个人是否能够参加这里面的全部会议。 示例 1: 输入: [[0,30],[5,10],[15,20]] 输出: false示例 2: 输…

jedis连接mysql_使用Jedis操作Redis数据库

Redis不仅是使用命令来操作&#xff0c;现在基本上主流的语言都有客户端支持&#xff0c;比如java、C、C#、C、php、Node.js、Go等。 在官方网站里列一些Java的客户端&#xff0c;有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多…

LeetCode 1243. 数组变换

文章目录1. 题目2. 解题1. 题目 首先&#xff0c;给你一个初始数组 arr。然后&#xff0c;每天你都要根据前一天的数组生成一个新的数组。 第 i 天所生成的数组&#xff0c;是由你对第 i-1 天的数组进行如下操作所得的&#xff1a; 假如一个元素小于它的左右邻居&#xff0c…

mysql5.7.17二进制包_mysql5.7二进制包安装方法

1.部署tar xf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gzmv mysql-5.7.17-linux-glibc2.5-x86_64 /application/mysql-5.7.17ln -s /application/mysql-5.7.17 /application/mysql2.授权chown -R mysql.mysql /application/mysql-5.7.173.初始化/application/mysql-5.7.17/bin…

LeetCode 1065. 字符串的索引对

文章目录1. 题目2. 解题1. 题目 给出 字符串 text 和 字符串列表 words, 返回所有的索引对 [i, j] 使得在索引对范围内的子字符串 text[i]…text[j]&#xff08;包括 i 和 j&#xff09;属于字符串列表 words。 示例 1: 输入: text "thestoryofleetcodeandme", wo…

LeetCode 157. 用 Read4 读取 N 个字符

文章目录1. 题目2. 解题1. 题目 给你一个文件&#xff0c;并且该文件只能通过给定的 read4 方法来读取&#xff0c;请实现一个方法使其能够读取 n 个字符。 read4 方法&#xff1a; API read4 可以从文件中读取 4 个连续的字符&#xff0c;并且将它们写入缓存数组 buf 中。 …