本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識(shí),其中主要介紹了關(guān)于性能調(diào)優(yōu)的相關(guān)問題,主要介紹了分區(qū)表的相關(guān)內(nèi)容,對(duì)于用戶而言,分區(qū)表是一個(gè)獨(dú)立的邏輯表,但是底層是由多個(gè)物理子表組成,下面一起來看一下,希望對(duì)大家有幫助。
推薦學(xué)習(xí):mysql視頻教程
對(duì)于用戶而言,分區(qū)表是一個(gè)獨(dú)立的邏輯表,但是底層是由多個(gè)物理子表組成。分區(qū)表對(duì)于用戶而言是一個(gè)完全封裝底層實(shí)現(xiàn)的黑盒子,對(duì)用戶而言是透明的,從文件系統(tǒng)中可以看到多個(gè)使用#分隔命名的表文件。
mysql在創(chuàng)建表時(shí)使用partition by子句定義每個(gè)分區(qū)存放的數(shù)據(jù),在執(zhí)行查詢的時(shí)候,優(yōu)化器會(huì)根據(jù)分區(qū)定義過濾那些沒有我們需要數(shù)據(jù)的分區(qū),這樣查詢就無須掃描所有分區(qū)。
分區(qū)的主要目的是將數(shù)據(jù)安好一個(gè)較粗的力度分在不同的表中,這樣可以將相關(guān)的數(shù)據(jù)存放在一起。
接下來,我將從以下6個(gè)方面來談?wù)劮謪^(qū)表,分別是分區(qū)表的應(yīng)用場(chǎng)景、分區(qū)表的限制、分區(qū)表的原理、分區(qū)表的類型、如何使用分區(qū)表、在使用分區(qū)表的時(shí)候需要注意的問題。
一、分區(qū)表的應(yīng)用場(chǎng)景
1、表非常大以至于無法全部都放在內(nèi)存中,或者只在表的最后部分有熱點(diǎn)數(shù)據(jù),其他均是歷史數(shù)據(jù)。
2、分區(qū)表的數(shù)據(jù)更容易維護(hù)
(1)批量刪除大量數(shù)據(jù)可以使用清除整個(gè)分區(qū)的方式
(2)對(duì)一個(gè)獨(dú)立分區(qū)進(jìn)行優(yōu)化、檢查、修復(fù)等操作
3、分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備
4、可以使用分區(qū)表來避免某些特殊的瓶頸
(1)innodb的單個(gè)索引的互斥訪問
(2)ext3文件系統(tǒng)的inode鎖競(jìng)爭(zhēng)
5、可以備份和恢復(fù)獨(dú)立的分區(qū)
二、分區(qū)表的限制
1、一個(gè)表最多只能有1024個(gè)分區(qū),在5.7版本的時(shí)候可以支持8196個(gè)分區(qū)
2、在早期的mysql中,分區(qū)表達(dá)式必須是整數(shù)或者是返回整數(shù)的表達(dá)式,在mysql5.5中,某些場(chǎng)景可以直接使用列來進(jìn)行分區(qū)。
3、如果分區(qū)字段中有主鍵或者唯一索引的列,那么所有主鍵列和唯一索引列都必須包含進(jìn)來。
4、分區(qū)表無法使用外鍵約束
三、分區(qū)表的原理
分區(qū)表由多個(gè)相關(guān)的底層表實(shí)現(xiàn),這個(gè)底層表也是由句柄對(duì)象標(biāo)識(shí),我們可以直接訪問各個(gè)分區(qū)。存儲(chǔ)引擎管理分區(qū)的各個(gè)底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲(chǔ)引擎),分區(qū)表的索引知識(shí)在各個(gè)底層表上各自加上一個(gè)完全相同的索引。從存儲(chǔ)引擎的角度來看,底層表和普通表沒有任何不同,存儲(chǔ)引擎也無須知道這是一個(gè)普通表還是一個(gè)分區(qū)表的一部分。分區(qū)表的操作按照以下的操作邏輯進(jìn)行:
1、select查詢
當(dāng)查詢一個(gè)分區(qū)表的時(shí)候,分區(qū)層先打開并鎖住所有的底層表,優(yōu)化器先判斷是否可以過濾部分分區(qū),然后再調(diào)用對(duì)應(yīng)的存儲(chǔ)引擎接口訪問各個(gè)分區(qū)的數(shù)據(jù)
2、insert操作
當(dāng)寫入一條記錄的時(shí)候,分區(qū)層先打開并鎖住所有的底層表,然后確定哪個(gè)分區(qū)接受這條記錄,再將記錄寫入對(duì)應(yīng)底層表。
3、delete操作
當(dāng)刪除一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,然后確定數(shù)據(jù)對(duì)應(yīng)的分區(qū),最后對(duì)相應(yīng)底層表進(jìn)行刪除操作。
4、update操作
當(dāng)更新一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,mysql先確定需要更新的記錄再哪個(gè)分區(qū),然后取出數(shù)據(jù)并更新,再判斷更新后的數(shù)據(jù)應(yīng)該再哪個(gè)分區(qū),最后對(duì)底層表進(jìn)行寫入操作,并對(duì)源數(shù)據(jù)所在的底層表進(jìn)行刪除操作。
有些操作時(shí)支持過濾的,例如,當(dāng)刪除一條記錄時(shí),MySQL需要先找到這條記錄,如果where條件恰好和分區(qū)表達(dá)式匹配,就可以將所有不包含這條記錄的分區(qū)都過濾掉,這對(duì)update同樣有效。如果是insert操作,則本身就是只命中一個(gè)分區(qū),其他分區(qū)都會(huì)被過濾掉。mysql先確定這條記錄屬于哪個(gè)分區(qū),再將記錄寫入對(duì)應(yīng)得曾分區(qū)表,無須對(duì)任何其他分區(qū)進(jìn)行操作。
雖然每個(gè)操作都會(huì)“先打開并鎖住所有的底層表”,但這并不是說分區(qū)表在處理過程中是鎖住全表的,如果存儲(chǔ)引擎能夠自己實(shí)現(xiàn)行級(jí)鎖,例如innodb,則會(huì)在分區(qū)層釋放對(duì)應(yīng)表鎖。
推薦學(xué)習(xí):mysql視頻教程