mysql 默认page大小_MySQL innodb_page_size
原標(biāo)題:MySQL innodb_page_size
墨墨導(dǎo)讀:Page是MySQL Innodb存儲(chǔ)的最基本結(jié)構(gòu),也是Innodb磁盤管理的最小單位,了解page的一些特性,可以更容易理解MySQL。
innodb_page_size作為innodb和OS交互單位。文件系統(tǒng)對(duì)文件的buffer IO,也是page為單位進(jìn)行處理的。Linux的默認(rèn)page的大小4096字節(jié),當(dāng)要將數(shù)據(jù)寫入到文件的時(shí)候,會(huì)先在內(nèi)存里,然后將對(duì)應(yīng)的page cache,整個(gè)的從內(nèi)存刷到磁盤上。但是如果要寫入的文件區(qū)域,因?yàn)檫€沒(méi)有被緩存或者被置換出去了等原因,在內(nèi)存里不存在對(duì)應(yīng)的page cache,則需要先將對(duì)應(yīng)page的內(nèi)容從磁盤上讀到內(nèi)存里,修改要寫入的數(shù)據(jù),然后在將整個(gè)page寫回到磁盤;在這種情況下,會(huì)有一次額外的讀IO開銷,IO的性能會(huì)有一定的損失。假如mysql的16K的頁(yè)表數(shù)據(jù)支持起,那就是一次內(nèi)存IO光是虛擬地址到物理地址的轉(zhuǎn)換就要去內(nèi)存查4次頁(yè)表,再算上真正的內(nèi)存訪問(wèn),需要5次內(nèi)存IO才能獲取一個(gè)內(nèi)存數(shù)據(jù)。
操作系統(tǒng)PAGE:
在操作系統(tǒng)層面,每個(gè)進(jìn)程都有自己獨(dú)立的地址空間,看到的都是操作系統(tǒng)虛擬出來(lái)的地址空間,虛擬地址最終還是要落在實(shí)際內(nèi)存的物理地址上進(jìn)行操作的。操作系統(tǒng)就會(huì)通過(guò)頁(yè)表的機(jī)制來(lái)實(shí)現(xiàn)進(jìn)程的虛擬地址到物理地址。其中每一頁(yè)的大小都是固定的。
獲取當(dāng)前操作系統(tǒng)的page size:
####X86:
[root@ens8 ~] # getconf PAGESIZE
4096
####ARM:
root@ens8ARM :~# getconf PAGESIZE
65536
頁(yè)表級(jí)數(shù):
頁(yè)表級(jí)數(shù)越少,虛擬地址到物理地址的映射會(huì)很快,但是需要管理的頁(yè)表項(xiàng)會(huì)很多,能支持的地址空間也有限。
相反頁(yè)表級(jí)數(shù)越多,需要的存儲(chǔ)的頁(yè)表數(shù)據(jù)就會(huì)越少,而且能支持到比較大的地址空間,但是虛擬地址到物理地址的映射就會(huì)越慢。
備注:ARM系統(tǒng)來(lái)說(shuō)需要編譯指定才可以。因?yàn)長(zhǎng)inux 默認(rèn)4kb頁(yè)是通過(guò)長(zhǎng)期的跟MySQL磨合,才有現(xiàn)在的穩(wěn)定的表現(xiàn)。
MySQL數(shù)據(jù)庫(kù)Page
InnoDB邏輯存儲(chǔ)單元主要分為表空間、段、區(qū)和頁(yè)。層級(jí)關(guān)系為tablespace -> segment -> extent(64個(gè)page,1M) -> page。(非常經(jīng)典的圖)
在看看innodb_page_size的官方描述:
第一個(gè)系統(tǒng)表空間數(shù)據(jù)文件(ibdata1)的最小文件大小取決于innodb_page_size值
innodb_page_size只能在初始化MySQL實(shí)例之前配置,不能在之后修改。如果沒(méi)有指定值,則使用默認(rèn)頁(yè)面大小初始化實(shí)例。
MySQL 5.7增加了對(duì)32KB和64KB頁(yè)面大小的支持。對(duì)于32KB和64KB的頁(yè)面大小,最大行長(zhǎng)度約為16000字節(jié)。當(dāng)innodb_page_size設(shè)置為32KB或64KB時(shí),不支持ROW_FORMAT= compression。對(duì)于innodb_page_size=32k,區(qū)段大小為2MB。對(duì)于innodb_page_size=64KB,區(qū)段大小為4MB。當(dāng)使用32KB或64KB的頁(yè)面大小時(shí),innodb_log_buffer_size應(yīng)該至少設(shè)置為16M(默認(rèn))。
默認(rèn)的16KB或更大的頁(yè)面大小適用于各種工作負(fù)載,特別是涉及表掃描的查詢和涉及批量更新的DML操作。對(duì)于涉及許多小寫操作的OLTP工作負(fù)載,較小的頁(yè)面大小可能更有效,在這種工作負(fù)載中,當(dāng)單個(gè)頁(yè)面包含許多行時(shí),可能會(huì)出現(xiàn)爭(zhēng)用問(wèn)題。對(duì)于通常使用較小塊的SSD存儲(chǔ)設(shè)備,較小的頁(yè)面也可能是有效的。保持InnoDB頁(yè)面大小接近存儲(chǔ)設(shè)備塊大小,可以最大限度地減少被重寫到磁盤的未更改數(shù)據(jù)量.
對(duì)于row,index,tablesapce的影響
Page對(duì)Row的影響:
對(duì)于4KB、8KB、16KB和32KB的頁(yè)大小,最大行大小(不包括存儲(chǔ)在頁(yè)外的任何可變長(zhǎng)度的列)略小于頁(yè)大小的一半。例如,默認(rèn)innodb_page_size為16KB的最大行大小約為8000字節(jié)。然而,對(duì)于InnoDB頁(yè)面大小為64KB的頁(yè)面,最大行大小大約是16000字節(jié)。LONGBLOB和LONGTEXT列必須小于4GB,包括BLOB和文本列在內(nèi)的總行大小必須小于4GB。
Page對(duì)index的影響:
如果在創(chuàng)建MySQL實(shí)例時(shí)通過(guò)指定innodb_page_size選項(xiàng)將InnoDB頁(yè)面大小減少到8KB或4KB,索引鍵的最大長(zhǎng)度將按比例降低,這是基于16KB頁(yè)面大小的3072字節(jié)限制。也就是說(shuō),當(dāng)頁(yè)面大小為8KB時(shí),最大索引鍵長(zhǎng)度為1536字節(jié),而當(dāng)頁(yè)面大小為4KB時(shí),最大索引鍵長(zhǎng)度為768字節(jié)。
不同的Page大小,表空間限制:
Pages對(duì)字段的影響 :
對(duì)于4KB、8KB、16KB和32KB的innodb_page_size設(shè)置,最大行長(zhǎng)度略小于數(shù)據(jù)庫(kù)頁(yè)的一半。例如,對(duì)于默認(rèn)的16KB InnoDB頁(yè)面大小,最大行長(zhǎng)度略小于8KB。對(duì)于64KB的頁(yè)面,最大行長(zhǎng)度略小于16KB。
如果一行不超過(guò)最大行長(zhǎng)度,則所有行都存儲(chǔ)在本地頁(yè)中。如果一行超過(guò)最大行長(zhǎng),則選擇可變長(zhǎng)度列用于外部頁(yè)外存儲(chǔ),直到該行符合最大行長(zhǎng)限制為止。可變長(zhǎng)度列的外部離頁(yè)存儲(chǔ)因行格式不同而不同:
COMPACTRow Formats:
當(dāng)一個(gè)可變長(zhǎng)度的列被選擇用于外部頁(yè)外存儲(chǔ)時(shí),InnoDB將前768個(gè)字節(jié)本地存儲(chǔ)在行中,其余的存儲(chǔ)在外部溢出的頁(yè)面中。每個(gè)這樣的列都有自己的溢出頁(yè)列表。768字節(jié)的前綴伴有一個(gè)20字節(jié)的值,該值存儲(chǔ)列的真實(shí)長(zhǎng)度,并指向存儲(chǔ)其余值的溢出列表
DYNAMICRow Formats:
當(dāng)一個(gè)可變長(zhǎng)度的列被選擇用于外部頁(yè)外存儲(chǔ)時(shí),InnoDB在本地的行中存儲(chǔ)一個(gè)20字節(jié)的指針,其余的則在外部存儲(chǔ)到溢出的頁(yè)面中,LONGBLOB和LONGTEXT列必須小于4GB,包括BLOB和TEXT列在內(nèi)的總行長(zhǎng)度必須小于4GB。
Page如何計(jì)算記錄數(shù)
page構(gòu)成結(jié)構(gòu):
除數(shù)據(jù)外ROW額外信息存在哪些:
16k頁(yè)為基準(zhǔn),能保存多少記錄數(shù):
按照上面Page結(jié)構(gòu)圖,可以如下計(jì)算:
1.page大小(16*1024=16384)- 必要信息(File Header38字節(jié)+page header56字節(jié)+虛擬最大最小記錄26字節(jié)+Page Directory4字節(jié)+File Trailer8字節(jié))=16252字節(jié)
2.約每4條記錄占用一個(gè)slot,一個(gè)slot大小占用2字節(jié)
3.row header(5字節(jié)+可變長(zhǎng)+非空占位符)+ 主鍵key長(zhǎng)度(如果沒(méi)有顯示聲明默認(rèn)會(huì)創(chuàng)建6字節(jié)row id)+ trxid6字節(jié)+ rollptr7字節(jié)
4.假如單行長(zhǎng)度計(jì)算公式為:row header5字節(jié) + 主鍵索引列4字節(jié) + 指針4字節(jié) = 13字節(jié)
單個(gè)page最多能容納最多行數(shù)為 單行長(zhǎng)度N+N/4*2 = 16252,
N為1203測(cè)試:
通過(guò)sysben壓測(cè),發(fā)現(xiàn)MySQL默認(rèn)頁(yè)16K 相比8K 對(duì)CPU壓力較小,但8k頁(yè)的情況下所有指標(biāo)都會(huì)有所提升。
sysbench壓測(cè)是基于主鍵,8k的頁(yè)來(lái)說(shuō),行小于4k的數(shù)據(jù)來(lái)說(shuō)性能提升,假如大于4k的數(shù)據(jù),性能肯定會(huì)有下降,因?yàn)闀?huì)出現(xiàn)行溢出,會(huì)導(dǎo)致讀取列需要多一個(gè)IO。所以不同的業(yè)務(wù)場(chǎng)景可以有效的調(diào)整innodb page size 進(jìn)行調(diào)試。當(dāng)然硬件也要支持,傳統(tǒng)的SAS硬盤會(huì)存在IO效率下降,更上一層的硬盤(SSD,PCIE)能提供更高的IOPS。
總結(jié)
那么innodb_page_size的如何設(shè)置,按照個(gè)人理解,生產(chǎn)環(huán)境中,可以選擇16kb 和8kb的長(zhǎng)度。
可以考慮一下方面:
1.遵守單行略小于頁(yè)大小的一半。不能發(fā)生行溢出現(xiàn)象,隨之而來(lái)的要求是盡量主鍵操作,分配跟多的內(nèi)存
2.硬件設(shè)備的支持,很多高端服務(wù)器cpu使用率也就在30%以內(nèi)的服務(wù)器,完全可以使用8kb,提高整體性能。
innodb_page_size設(shè)置問(wèn)題,最終還是io性能方面的優(yōu)化。需要有效的利用MySQL的一些特性(索引組織表,盡量走主鍵避免回表,盡量減少隨機(jī)讀寫等)結(jié)合實(shí)際情況進(jìn)行配置。
前幾天一起工作的同事聊到,現(xiàn)在出現(xiàn)新的高端內(nèi)存。又能放到內(nèi)存,又能保存數(shù)據(jù)的內(nèi)存條!
墨天輪原文鏈接:https://www.modb.pro/db/40387(復(fù)制到瀏覽器中打開或者點(diǎn)擊“閱讀原文”)返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的mysql 默认page大小_MySQL innodb_page_size的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php linux 删除文件夹,linu
- 下一篇: mysql delette_关于字符串: