日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
簡(jiǎn)易教程:學(xué)會(huì)使用innodb壓縮數(shù)據(jù)庫(kù)(配置innodb壓縮數(shù)據(jù)庫(kù))

InnoDB是MySQL中最常用的存儲(chǔ)引擎。雖然它具有可靠性和高性能等優(yōu)勢(shì),但隨著數(shù)據(jù)增長(zhǎng),表的大小不斷增加,維護(hù)成本也逐漸增加。為了解決這個(gè)問(wèn)題,MySQL在5.7版本中提供了InnoDB數(shù)據(jù)壓縮。

成都創(chuàng)新互聯(lián)是少有的成都網(wǎng)站制作、網(wǎng)站建設(shè)、營(yíng)銷型企業(yè)網(wǎng)站、小程序開(kāi)發(fā)、手機(jī)APP,開(kāi)發(fā)、制作、設(shè)計(jì)、賣(mài)鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年創(chuàng)立,堅(jiān)持透明化,價(jià)格低,無(wú)套路經(jīng)營(yíng)理念。讓網(wǎng)頁(yè)驚喜每一位訪客多年來(lái)深受用戶好評(píng)

數(shù)據(jù)庫(kù)壓縮是MySQL的一項(xiàng)重要功能,通過(guò)壓縮可以減少磁盤(pán)空間的使用,提高系統(tǒng)性能,并減少磁盤(pán)輸入/輸出操作的數(shù)量。這篇文章將介紹InnoDB壓縮的好處以及如何在MySQL中使用。

好處

1.減少磁盤(pán)使用:InnoDB壓縮可以減少其表的磁盤(pán)使用量,從而減少存儲(chǔ)和備份數(shù)據(jù)庫(kù)的成本。

2.提高性能:數(shù)據(jù)壓縮減少了磁盤(pán)的讀寫(xiě)操作,可以提高系統(tǒng)的性能。

3.降低內(nèi)存使用:壓縮了的數(shù)據(jù)需要更少的內(nèi)存來(lái)緩存,可以讓MySQL占用更少的內(nèi)存。

使用步驟

1.檢查是否支持壓縮:使用以下命令查看InnoDB是否支持壓縮。

SHOW VARIABLES LIKE ‘innodb_file_per_table’;

如果該值為ON,則表示InnoDB支持?jǐn)?shù)據(jù)壓縮。

2.創(chuàng)建壓縮表:使用CREATE TABLE語(yǔ)句創(chuàng)建InnoDB壓縮表。在CREATE TABLE語(yǔ)句中,可以使用ROW_FORMAT = COMPRESSED指定數(shù)據(jù)壓縮模式。

CREATE TABLE compressed_table (

id INT UNSIGNED NOT NULL AUTO_INCREMENT,

data VARCHAR(200),

PRIMARY KEY (id)

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;

3.檢查是否壓縮:使用以下命令檢查表的大小是否有所減少。

SELECT

TABLE_NAME AS `Table`,

ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) `Size (MB)`

FROM

information_schema.TABLES

WHERE

TABLE_SCHEMA = ‘your_db_name’ AND

TABLE_NAME = ‘your_table_name’;

4.導(dǎo)入數(shù)據(jù):將數(shù)據(jù)導(dǎo)入到壓縮表中,導(dǎo)入過(guò)程與常規(guī)表相同。

INSERT INTO compressed_table (data) VALUES (‘Hello World’);

5.調(diào)整壓縮比例:可以使用以下命令更改表的壓縮比率。

ALTER TABLE compressed_table ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16;

注意:壓縮比例的值越低,壓縮效果越好,但壓縮表的性能也會(huì)降低。通常建議使用16K或32K的壓縮比例。

6.檢查表大?。涸俅问褂肧ELECT語(yǔ)句檢查表的大小是否有所減少。

SELECT

TABLE_NAME AS `Table`,

ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) `Size (MB)`

FROM

information_schema.TABLES

WHERE

TABLE_SCHEMA = ‘your_db_name’ AND

TABLE_NAME = ‘your_table_name’;

結(jié)論

InnoDB壓縮是一種節(jié)省磁盤(pán)空間和提高系統(tǒng)性能的好方法。如果你的MySQL數(shù)據(jù)庫(kù)中包含大量的數(shù)據(jù),那么壓縮可以幫助你節(jié)省大量的存儲(chǔ)空間。同時(shí),壓縮表的讀寫(xiě)性能也非常高,使得開(kāi)發(fā)人員可以更快地讀取和更新表中的數(shù)據(jù)。在使用MySQL數(shù)據(jù)庫(kù)時(shí),建議你嘗試使用InnoDB的壓縮功能。

相關(guān)問(wèn)題拓展閱讀:

  • MySQL innodb引擎深入講解
  • mysql建立數(shù)據(jù)庫(kù)表的時(shí)候TYPE=InnoDB有什么作用

MySQL innodb引擎深入講解

表空間(ibd文件),一個(gè)MySQL實(shí)例可以對(duì)應(yīng)多個(gè)表空間,用于存儲(chǔ)記錄,索引等數(shù)據(jù)。

段,分為數(shù)據(jù)段、索引段、回滾段,innodb是索引組織表,數(shù)據(jù)段就是B+Tree的葉子節(jié)點(diǎn),索引段為非葉姿廳滑子節(jié)點(diǎn),段用來(lái)管理多個(gè)區(qū)。

區(qū),表空間的單元結(jié)構(gòu),每個(gè)區(qū)的大小為1M,默認(rèn)情況下,innodb存儲(chǔ)引擎頁(yè)大小為16K,即一個(gè)區(qū)中一共有64個(gè)連續(xù)的頁(yè)。

頁(yè),是innodb存儲(chǔ)引擎磁盤(pán)管理的最小單元,每個(gè)頁(yè)的大小為16K,為了保證頁(yè)的連續(xù)性,innodb存儲(chǔ)引擎每次從磁盤(pán)申請(qǐng)4~5個(gè)區(qū)。

行,innodb存儲(chǔ)引擎數(shù)據(jù)是按行進(jìn)行存儲(chǔ)的。Trx_id 最后一次事務(wù)操作的id、roll_pointer滾動(dòng)指針。

i

nnodb的內(nèi)存結(jié)構(gòu)

,由Buffer Pool、Change Buffer和Log Buffer組成。

Buffer Pool

: 緩沖池是主內(nèi)存中的一個(gè)區(qū)域,里面可以緩存磁盤(pán)上經(jīng)常操作的真實(shí)數(shù)據(jù),在執(zhí)行增刪改查操作時(shí),先操作緩沖池中的數(shù)據(jù)(若緩沖池么有數(shù)據(jù),則從磁盤(pán)加載并緩存),然后再以一定頻率刷新磁盤(pán),從而減少磁盤(pán)IO,加快處理速度。

緩沖池以跡臘page頁(yè)為單位,底層采用鏈表數(shù)據(jù)結(jié)構(gòu)管理page,根據(jù)狀態(tài),將page分為三種類型:

1、free page 即空閑page,未被使用。

2、clean page 被使用page,數(shù)據(jù)沒(méi)有被修改過(guò)。

3、dirty page 臟頁(yè),被使用page,數(shù)據(jù)被修改過(guò),這個(gè)page當(dāng)中的數(shù)據(jù)和磁盤(pán)當(dāng)中的數(shù)據(jù) 不一致。說(shuō)得簡(jiǎn)單點(diǎn)就是緩沖池中的數(shù)據(jù)改了,磁盤(pán)中的沒(méi)改,因?yàn)檫€沒(méi)刷寫(xiě)到磁盤(pán)。

Change Buffer

:更改緩沖區(qū)(針對(duì)于非唯一二級(jí)索引頁(yè)),在執(zhí)行DML語(yǔ)句時(shí),如果這些數(shù)據(jù)page沒(méi)有在Buffer Pool中,不會(huì)直接操作磁盤(pán),而會(huì)將數(shù)據(jù)變更存在更改緩沖區(qū)Change Buffer中,在未來(lái)數(shù)據(jù)被讀取時(shí)。再將數(shù)據(jù)合并恢復(fù)到Buffer Pool中,再將合并后的數(shù)據(jù)刷新到磁盤(pán)中。

二級(jí)索引通常是非唯一的,并且以相對(duì)隨機(jī)的順序插入二級(jí)索引頁(yè),同樣,刪除和更新可能會(huì)影響索引樹(shù)中不相鄰的二級(jí)索引頁(yè)。如果每一次都操作磁盤(pán),會(huì)造成大量磁盤(pán)IO,有了Change Buffer之后,我們可以在緩沖池中進(jìn)行合并處理,減少磁盤(pán)IO。

Adaptive Hash Index: 自適應(yīng)hash索引,用于優(yōu)化對(duì)Buffer Pool數(shù)據(jù)的查詢,InnoDB存儲(chǔ)引擎會(huì)監(jiān)控對(duì)表上各索引頁(yè)的查詢,如果觀察到hash索引可以提升速度,則建立hash索引,稱之為自適應(yīng)hash索引。無(wú)需人工干預(yù),系統(tǒng)根據(jù)情況自動(dòng)完成。

參數(shù):innodb_adaptive_hash_index

Log Buffer: 日志緩沖區(qū),用來(lái)保存要寫(xiě)入到磁盤(pán)中的log日志數(shù)據(jù)(redo log、undo log),默認(rèn)大小為16M,日志緩沖區(qū)的日志會(huì)定期刷新到磁盤(pán)中,如果需要更新,插入或刪除許多行的事務(wù),增加日志緩沖區(qū)的大小可以節(jié)省磁盤(pán)IO。

參數(shù): innodb_log_buffer_size 緩沖區(qū)大小

innodb_flush_log_at_trx_commit 日志刷新到磁盤(pán)時(shí)機(jī)

innodb_flush_log_at_trx_commit=1 表示日志在每次事務(wù)提交時(shí)寫(xiě)入并刷新到磁盤(pán)

2 表示日志在每次事務(wù)提交后寫(xiě)入,并每秒刷新到磁盤(pán)一次

0 表示每秒將日志寫(xiě)入并刷新到磁盤(pán)一次。

InnoDB 的磁盤(pán)結(jié)構(gòu),由系統(tǒng)表空間(ibdata1),獨(dú)立表空間(*.ibd),通用表空間,撤銷表空間(undo tablespaces), 臨時(shí)表空間(Temporary Tablespaces), 雙寫(xiě)緩沖區(qū)(Doublewrite Buffer files), 重做日志(Redo Log).

系統(tǒng)表空間(ibdata1): 系統(tǒng)表空間是更改緩沖區(qū)的存儲(chǔ)區(qū)域,如果表是在系統(tǒng)表空間而不是每個(gè)表文件或者通用表空間中創(chuàng)建的,它也可能包含表和索引數(shù)據(jù)。

參數(shù)為: innodb_data_file_path

獨(dú)立表空間(*.ibd): 每個(gè)表的文件表空間伏陪包含單個(gè)innodb表的數(shù)據(jù)和索引,并存儲(chǔ)在文件系 統(tǒng)上的單個(gè)數(shù)據(jù)文件中。 參數(shù): innodb_file_per_table

通用表空間: 需要通過(guò)create tablespace 語(yǔ)法創(chuàng)建,創(chuàng)建表時(shí) 可以指定該表空間。

create tablespace xxx add datafile ‘file_name’ engine=engine_name

create table table_name …. tablespace xxx

撤銷表空間(undo tablespaces): MySQL實(shí)例在初始化時(shí)會(huì)自動(dòng)創(chuàng)建兩個(gè)默認(rèn)的undo表空間(初始大小16K,undo_001,undo_002),用于存儲(chǔ)undo log 日志

臨時(shí)表空間(Temporary Tablespaces): innodb使用會(huì)話臨時(shí)表空和全局表空間,存儲(chǔ)用 戶創(chuàng)建的臨時(shí)表等數(shù)據(jù)。

雙寫(xiě)緩沖區(qū)(Doublewrite Buffer files): innodb引擎將數(shù)據(jù)頁(yè)從Buffer Pool刷新到磁盤(pán)前,先將數(shù)據(jù)頁(yè)寫(xiě)入緩沖區(qū)文件中,便于系統(tǒng)異常時(shí)恢復(fù)數(shù)據(jù)。

重做日志(Redo Log): 是用來(lái)實(shí)現(xiàn)事務(wù)的持久性,該日志文件由兩部分組成,重做日志緩沖區(qū)(redo log buffer)以及重做日志文件(redo log),前者是在內(nèi)存中,后者在磁盤(pán)中,當(dāng)事務(wù)提交之后會(huì)把修改信息都會(huì)存儲(chǔ)到該日志中,用于在刷新臟頁(yè)到磁盤(pán)時(shí),發(fā)送錯(cuò)誤時(shí),進(jìn)行數(shù)據(jù)恢復(fù)使用。以循環(huán)方式寫(xiě)入重做日志文件,涉及兩個(gè)文件ib_logfile0,ib_logfile1。

那內(nèi)存結(jié)構(gòu)中的數(shù)據(jù)是如何刷新到磁盤(pán)中的? 在MySQL中有4個(gè)線程負(fù)責(zé)刷新日志到磁盤(pán)。

1、Master Thread, mysql核心后臺(tái)線程,負(fù)責(zé)調(diào)度其它線程,還負(fù)責(zé)將緩沖池中的數(shù)據(jù)異 步刷新到磁盤(pán)中,保持?jǐn)?shù)據(jù)的一致性,還包括臟頁(yè)的刷新,合并插入緩沖、undo頁(yè)的回 收。

2、IO Thread,在innodb存儲(chǔ)引擎中大量使用了AIO來(lái)處理IO請(qǐng)求,這樣可以極大地提高數(shù) 據(jù)庫(kù)的性能,而IO Thead主要負(fù)責(zé)這些IO請(qǐng)求的回調(diào)。

4個(gè)讀線程 Read thread負(fù)責(zé)讀操作

4個(gè)寫(xiě)線程write thread負(fù)責(zé)寫(xiě)操作

1個(gè)Log thread線程 負(fù)責(zé)將日志緩沖區(qū)刷新到磁盤(pán)

1個(gè)insert buffer線程 負(fù)責(zé)將寫(xiě)入緩沖區(qū)內(nèi)容刷新到磁盤(pán)

3、Purge Thread,主要用于回收事務(wù)已經(jīng)提交了的undo log,在事務(wù)提交之后,undo log 可能不用了,就用它來(lái)回收。

4、Page Cleaner Thread, 協(xié)助Master Thread 刷新臟頁(yè)到磁盤(pán)的線程,它可以減輕主線程 的壓力,減少阻塞。

事務(wù)就是一組操作的,它是一個(gè)不可分割的工作單位,事務(wù)會(huì)把所有的操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這些操作要么同時(shí)成功,要么同時(shí)失效。

事務(wù)的4大特性分為:

如何保證事務(wù)的4大特性,原子性,一致性和持久性是由innodb存儲(chǔ)引擎底層的兩份日志來(lái)保證的,分別是redo log和undo log。對(duì)于隔離性是由鎖機(jī)制和MVCC(多版本并發(fā)控制)來(lái)實(shí)現(xiàn)的。

redo log,稱為重做日志,記錄的是事務(wù)提交時(shí)數(shù)據(jù)頁(yè)的物理修改,是用來(lái)實(shí)現(xiàn)事務(wù)的持久性。該日志文件由兩部分組成: 重做日志緩沖redo log buffer及重做日志文件redo log file,前者是在內(nèi)存中,后者是在磁盤(pán)中,當(dāng)事務(wù)提交之后會(huì)把所有修改信息都存到該日志文件中,用于在刷新臟頁(yè)到磁盤(pán),發(fā)送錯(cuò)誤時(shí),進(jìn)行數(shù)據(jù)的恢復(fù)使用,從而保證事務(wù)的持久性。

具體的操作流程是:

1、客戶端發(fā)起事務(wù)操作,包含多條DML語(yǔ)句。首先去innodb中的buffer pool中的數(shù)據(jù)頁(yè)去查找有沒(méi)有我們要更新的這些數(shù)據(jù),如果沒(méi)有則通過(guò)后臺(tái)線程從磁盤(pán)中加載到buffer pool對(duì)應(yīng)的數(shù)據(jù)頁(yè)中,然后就可以在緩沖池中進(jìn)行數(shù)據(jù)操作了。

2、此時(shí)緩沖池中的數(shù)據(jù)頁(yè)發(fā)生了變更,還沒(méi)刷寫(xiě)到磁盤(pán),這個(gè)數(shù)據(jù)頁(yè)稱為臟頁(yè)。臟頁(yè)不是實(shí)時(shí)刷新到磁盤(pán)的,而是根據(jù)你配置的刷寫(xiě)策略進(jìn)行刷寫(xiě)到磁盤(pán)的(innodb_flush_log_at_trx_commit,0,1,2三個(gè)值)。如果臟頁(yè)在往磁盤(pán)刷新的時(shí)候出現(xiàn)了故障,會(huì)丟失數(shù)據(jù),導(dǎo)致事務(wù)的持久性得不到保證。為了避免這種現(xiàn)象,當(dāng)對(duì)緩沖池中的數(shù)據(jù)進(jìn)行增刪改操作時(shí),會(huì)把增刪改記錄到redo log buffer當(dāng)中,redo log buffer會(huì)把數(shù)據(jù)頁(yè)的物理變更持久化到磁盤(pán)文件中(ib_logfile0/ib_logfile1)。如果臟頁(yè)刷新失敗,就可以通過(guò)這兩個(gè)日志文件進(jìn)行恢復(fù)。

undo log,它是用來(lái)解決事務(wù)的原子性的,也稱為回滾日志。用于記錄數(shù)據(jù)被修改前的信息,作用包括:提供回滾和MVCC多版本并發(fā)控制。

undo log和redo log的記錄物理日志不一樣,它是邏輯日志??梢哉J(rèn)為當(dāng)delete一條記錄時(shí),undo log中會(huì)記錄一條對(duì)應(yīng)的insert記錄,當(dāng)update一條記錄時(shí),它記錄一條對(duì)應(yīng)相反的update記錄,當(dāng)執(zhí)行rollback時(shí),就可以從undo log中的邏輯記錄讀取到相應(yīng)的內(nèi)容并進(jìn)行回滾。

undo log銷毀: undo log 在事務(wù)執(zhí)行時(shí)產(chǎn)生,事務(wù)提交時(shí),并不會(huì)立即刪除undo log,因?yàn)檫@些日子可能用于MVCC。

undo log存儲(chǔ): undo log 采用段的方式進(jìn)行管理和記錄,存放在前面介紹的rollback segment回滾段中,內(nèi)部包含1024個(gè)undo log segment。

mvcc(multi-Version Concurrency Control),多版本并發(fā)控制,指維護(hù)一個(gè)數(shù)據(jù)的多個(gè)版本,使得讀寫(xiě)操作沒(méi)有沖突,快照讀為MySQL實(shí)現(xiàn)MVCC提供了一個(gè)非阻塞讀功能,MVCC的具體實(shí)現(xiàn),還需要依賴于數(shù)據(jù)庫(kù)記錄中的三個(gè)隱式字段,undo log日志、readView。

read committed 每次select 都生成一個(gè)快照讀

repeatable read 開(kāi)啟事務(wù)后之一個(gè)select語(yǔ)句才是快照讀的地方

serializable 快照讀會(huì)退化為當(dāng)前讀。

mvcc的實(shí)現(xiàn)原理

DB_TRX_ID: 最近修改事務(wù)ID,記錄插入這條記錄或最后一次修改該記錄的事務(wù)ID

DB_ROLL_PTR: 回滾指針,指向這條記錄的上一個(gè)版本,用于配合undo log,指向上一個(gè) 版本

DB_ROW_ID: 隱藏主鍵,如果表結(jié)構(gòu)沒(méi)有指定主鍵,將會(huì)生成該隱藏字段。

m_ids當(dāng)前活躍的事務(wù)ID

min_trx_id: 最小活躍事務(wù)id

max_trx_id: 預(yù)分配事務(wù)ID,當(dāng)前更大事務(wù)id+1,因?yàn)槭聞?wù)id是自增的

creator_trx_id: ReadView創(chuàng)建者的事務(wù)ID

版本鏈數(shù)據(jù)訪問(wèn)規(guī)則:

trx_id: 表示當(dāng)前的事務(wù)ID

1、trx_id == creator_trx_id? 可以訪問(wèn)讀版本–>成立的話,說(shuō)明數(shù)據(jù)是當(dāng)前這個(gè)事務(wù)更改的

2、trx_id 成立,說(shuō)明數(shù)據(jù)已經(jīng)提交了。

3、trx_id>max_trx_id?不可用訪問(wèn)讀版本-> 成立的話,說(shuō)明該事務(wù)是在ReadView生成后才開(kāi)啟的。

4、min_trx_id

mysql建立數(shù)據(jù)庫(kù)表的時(shí)候TYPE=InnoDB有什么作用

TYPE=InnoDB 表示數(shù)據(jù)表的引陸裂擎類型為innoDB

innodb存儲(chǔ)引擎: 面向oltp(online transaction processing)、行鎖、支持外鍵、非鎖定讀、默稿悉派認(rèn)采用repeaable級(jí)別(可重復(fù)讀)通過(guò)next-keylocking策略避免鍵賀幻讀、插入緩沖、二次寫(xiě)、自適應(yīng)哈希索引、預(yù)讀

從 MySQL 5.7 開(kāi)始,開(kāi)發(fā)人員改變了 InnoDB 構(gòu)建二級(jí)索引的方式,采用自下而上的方法,而不是早期版本中自上而下的方法了。在這篇文章中,我們將通過(guò)一個(gè)示例來(lái)說(shuō)明如何構(gòu)建 InnoDB 索引。最后,我將解釋如何通過(guò)為 innodb_fill_factor 設(shè)置更合適的值。

索引構(gòu)建過(guò)程

在有數(shù)據(jù)的表上構(gòu)建索引,InnoDB 中有以下幾個(gè)階段:1.讀取階段(從聚簇索引讀取并構(gòu)建二級(jí)索引條目)2.合并排序階段3.插入階段(將排序記錄插入二級(jí)索引)在 5.6 版本之前,MySQL 通過(guò)一次插入一條記錄來(lái)構(gòu)建二級(jí)索引。這是一種“自上而下”的方法。搜索插入位置從樹(shù)的根部(頂部)開(kāi)始并達(dá)到葉頁(yè)(底部)。該記錄插入光標(biāo)指向的葉頁(yè)上。在查找插入位置和進(jìn)行業(yè)面拆分和合并方面開(kāi)銷很大。從MySQL 5.7開(kāi)始,添加索引期間的插入階段使用“排序索引構(gòu)建”,也稱為“批量索引加載”。在這種方法中,索引是“自下而上”構(gòu)建的。即葉頁(yè)(底部)首先構(gòu)建,然雀旦后非葉級(jí)別直到根(頂部)。

示例

在這些情況下使用排序的索引構(gòu)建:

ALTER TABLE t1 ADD INDEX(or CREATE INDEX)

ALTER TABLE t1 ADD FULLTEXT INDEX

ALTER TABLE t1 ADD COLUMN, ALGORITHM = INPLACE

OPIMIZE t1

對(duì)于最后兩個(gè)用例,ALTER 會(huì)創(chuàng)建一個(gè)中間表。中間表索引(主要和次要)使用“排序索引構(gòu)建”構(gòu)建。

算法

在 0 級(jí)別創(chuàng)建頁(yè),還要為此頁(yè)創(chuàng)建一個(gè)游標(biāo)

使用 0 級(jí)別處的游標(biāo)插入頁(yè)面,直到頃返擾填滿

頁(yè)面填滿后,創(chuàng)建一個(gè)兄弟頁(yè)(不要插入到兄弟頁(yè))

為當(dāng)前的整頁(yè)創(chuàng)建節(jié)點(diǎn)指針(子頁(yè)中的最小鍵,子頁(yè)碼),并將節(jié)點(diǎn)指針插入上一級(jí)(父頁(yè))

在較高級(jí)別,檢查游標(biāo)是否已定位。如果沒(méi)有,請(qǐng)為該級(jí)別創(chuàng)建父頁(yè)和游標(biāo)

在父頁(yè)插入節(jié)點(diǎn)指針

如果父頁(yè)已填滿,請(qǐng)重復(fù)步驟 3, 4, 5, 6

現(xiàn)在插入兄弟頁(yè)并使游標(biāo)指向兄弟頁(yè)

在所有插入的末尾,每個(gè)級(jí)別的游標(biāo)指向最右邊的頁(yè)。提交所有游標(biāo)(意味著提交修改頁(yè)面的迷你事務(wù),釋放所有鎖存器)

為簡(jiǎn)單起見(jiàn),上述算法跳過(guò)了有關(guān)壓縮頁(yè)和 BLOB(外部存儲(chǔ)的 BLOB)處理的細(xì)節(jié)。

通過(guò)自下而上的方式構(gòu)建索引

為簡(jiǎn)單起見(jiàn),假設(shè)子頁(yè)和非子頁(yè)中允許的 更大記錄數(shù)為 3

CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c BLOB);

INSERT INTO t1 VALUES (1, 11, ‘hello111’);

INSERT INTO t1 VALUES (2, 22, ‘hello222’);

INSERT INTO t1 VALUES (3, 33, ‘hello333’);

INSERT INTO t1 VALUES (4, 44, ‘hello444’);

INSERT INTO t1 VALUES (5, 55, ‘hello555’);

INSERT INTO t1 VALUES (6, 66, ‘hello666’);

INSERT INTO t1 VALUES (7, 77, ‘hello777’);

INSERT INTO t1 VALUES (8, 88, ‘hello888’);

INSERT INTO t1 VALUES (9, 99, ‘hello999’);

INSERT INTO t1 VALUES (10, 1010, ‘hello101010’);

ALTER TABLE t1 ADD INDEX k1(b);

InnoDB 將主鍵字段追加到二級(jí)索引。二級(jí)索引 k1 的記錄格式為(b, a)。在排序階段完成后,記錄為:

(11,1), (22,2), (33,3), (44,4), (55,5), (66,6), (77,7), (88,8), (99,9), (1010, 10)

初始插入階段

讓我們從記錄 (11,1) 開(kāi)世做始。

在 0 級(jí)別(葉級(jí)別)創(chuàng)建頁(yè)

創(chuàng)建一個(gè)到頁(yè)的游標(biāo)

所有插入都將轉(zhuǎn)到此頁(yè)面,直到它填滿了

箭頭顯示游標(biāo)當(dāng)前指向的位置。它目前位于第 5 頁(yè),下一個(gè)插入將轉(zhuǎn)到此頁(yè)面。

還有兩個(gè)空閑插槽,因此插入記錄 (22,2) 和 (33,3) 非常簡(jiǎn)單

對(duì)于下一條記錄 (44,4),頁(yè)碼 5 已滿(前面提到的假設(shè)更大記錄數(shù)為 3)。這就是步驟。

頁(yè)填充時(shí)的索引構(gòu)建

創(chuàng)建一個(gè)兄弟頁(yè),頁(yè)碼 6

不要插入兄弟頁(yè)

在游標(biāo)處提交頁(yè)面,即迷你事務(wù)提交,釋放鎖存器等

作為提交的一部分,創(chuàng)建節(jié)點(diǎn)指針并將其插入到 【當(dāng)前級(jí)別 + 1】 的父頁(yè)面中(即在 1 級(jí)別)

節(jié)點(diǎn)指針的格式 (子頁(yè)面中的最小鍵,子頁(yè)碼) 。第 5 頁(yè)的最小鍵是 (11,1) 。在父級(jí)別插入記錄 ((11,1),5)。

1 級(jí)別的父頁(yè)尚不存在,MySQL 創(chuàng)建頁(yè)碼 7 和指向頁(yè)碼 7 的游標(biāo)。

將 ((11,1),5) 插入第 7 頁(yè)

現(xiàn)在,返回到 0 級(jí)并創(chuàng)建從第 5 頁(yè)到第 6 頁(yè)的鏈接,反之亦然

0 級(jí)別的游標(biāo)現(xiàn)在指向兄弟頁(yè),頁(yè)碼為 6

將 (44,4) 插入第 6 頁(yè)

下一個(gè)插入 – (55,5) 和 (66,6) – 很簡(jiǎn)單,它們轉(zhuǎn)到第 6 頁(yè)。

插入記錄 (77,7) 類似于 (44,4),除了父頁(yè)面 (頁(yè)面編號(hào) 7) 已經(jīng)存在并且它有兩個(gè)以上記錄的空間。首先將節(jié)點(diǎn)指針 ((44,4),8) 插入第 7 頁(yè),然后將 (77,7) 記錄到同級(jí) 8 頁(yè)中。

插入記錄 (88,8) 和 (99,9) 很簡(jiǎn)單,因?yàn)榈?8 頁(yè)有兩個(gè)空閑插槽。

下一個(gè)插入 (1010,10) 。將節(jié)點(diǎn)指針 ((77,7),8) 插入 1級(jí)別的父頁(yè)(頁(yè)碼 7)。

MySQL 在 0 級(jí)創(chuàng)建同級(jí)頁(yè)碼 9。將記錄 (1010,10) 插入第 9 頁(yè)并將光標(biāo)更改為此頁(yè)面。

以此類推。在上面的示例中,數(shù)據(jù)庫(kù)在 0 級(jí)別提交到第 9 頁(yè),在 1 級(jí)別提交到第 7 頁(yè)。

我們現(xiàn)在有了一個(gè)完整的 B+-tree 索引,它是自下至上構(gòu)建的!

索引填充因子

全局變量 innodb_fill_factor 用于設(shè)置插入 B-tree 頁(yè)中的空間量。默認(rèn)值為 100,表示使用整個(gè)業(yè)面(不包括頁(yè)眉)。聚簇索引具有 innodb_fill_factor=100 的免除項(xiàng)。 在這種情況下,聚簇索引也空間的 1 /16 保持空閑。即 6.25% 的空間用于未來(lái)的 DML。

值 80 意味著 MySQL 使用了 80% 的頁(yè)空間填充,預(yù)留 20% 于未來(lái)的更新。如果 innodb_fill_factor=100 則沒(méi)有剩余空間供未來(lái)插入二級(jí)索引。如果在添加索引后,期望表上有更多的 DML,則可能導(dǎo)致業(yè)面拆分并再次合并。在這種情況下,建議使用之間的值。此變量還會(huì)影響使用 OPTIMIZE TABLE 和 ALTER TABLE DROP COLUMN, ALGOITHM=INPLACE 重新創(chuàng)建的索引。也不應(yīng)該設(shè)置太低的值,例如低于 50。因?yàn)樗饕龝?huì)占用浪費(fèi)更多的磁盤(pán)空間,值較低時(shí),索引中的頁(yè)數(shù)較多,索引統(tǒng)計(jì)信息的采樣可能不是更佳的。優(yōu)化器可以選擇具有次優(yōu)統(tǒng)計(jì)信息的錯(cuò)誤查詢計(jì)劃。

排序索引構(gòu)建的優(yōu)點(diǎn)

沒(méi)有頁(yè)面拆分(不包括壓縮表)和合并

沒(méi)有重復(fù)搜索插入位置

插入不會(huì)被重做記錄(頁(yè)分配除外),因此重做日志子系統(tǒng)的壓力較小

缺點(diǎn)

ALTER 正在進(jìn)行時(shí),插入性能降低 Bug#82940,但在后續(xù)版本中計(jì)劃修復(fù)。

請(qǐng)點(diǎn)擊輸入圖片描述

配置innodb壓縮數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于配置innodb壓縮數(shù)據(jù)庫(kù),簡(jiǎn)易教程:學(xué)會(huì)使用innodb壓縮數(shù)據(jù)庫(kù),MySQL innodb引擎深入講解,mysql建立數(shù)據(jù)庫(kù)表的時(shí)候TYPE=InnoDB有什么作用的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享題目:簡(jiǎn)易教程:學(xué)會(huì)使用innodb壓縮數(shù)據(jù)庫(kù)(配置innodb壓縮數(shù)據(jù)庫(kù))
標(biāo)題URL:http://www.5511xx.com/article/djgosdj.html