存儲(chǔ)引擎概念
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi)存)中。這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過(guò)選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善你的應(yīng)用的整體功能。
目前創(chuàng)新互聯(lián)建站已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、康樂網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。存儲(chǔ)引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。
InnoDB(B+樹)
InnoDB 底層存儲(chǔ)結(jié)構(gòu)為B+樹, B樹的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)innodb的一個(gè)page,page大小是固定的,一般設(shè)為 16k。其中非葉子節(jié)點(diǎn)只有鍵值,葉子節(jié)點(diǎn)包含完成數(shù)據(jù)。
數(shù)據(jù)庫(kù):存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
適用場(chǎng)景:
1)經(jīng)常更新的表,適合處理多重并發(fā)的更新請(qǐng)求。
2)支持事務(wù)。
3)可以從災(zāi)難中恢復(fù)(通過(guò) bin-log 日志等)。
4)外鍵約束。只有他支持外鍵。
5)支持自動(dòng)增加列屬性 auto_increment。
TokuDB(Fractal Tree-節(jié)點(diǎn)帶數(shù)據(jù))
TokuDB 底層存儲(chǔ)結(jié)構(gòu)為 Fractal Tree,Fractal Tree 的結(jié)構(gòu)與 B+樹有些類似, 在 Fractal Tree中,每一個(gè) child 指針除了需要指向一個(gè) child 節(jié)點(diǎn)外,還會(huì)帶有一個(gè) Message Buffer ,這個(gè)Message Buffer 是一個(gè) FIFO 的隊(duì)列,用來(lái)緩存更新操作。
例如,一次插入操作只需要落在某節(jié)點(diǎn)的 Message Buffer 就可以馬上返回了,并不需要搜索到葉子節(jié)點(diǎn)。這些緩存的更新會(huì)在查詢時(shí)或后臺(tái)異步合并應(yīng)用到對(duì)應(yīng)的節(jié)點(diǎn)中。
數(shù)據(jù)庫(kù):存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
TokuDB 在線添加索引,不影響讀寫操作, 非常快的寫入性能, Fractal-tree 在事務(wù)實(shí)現(xiàn)上有優(yōu)勢(shì)。 他主要適用于訪問(wèn)頻率不高的數(shù)據(jù)或歷史數(shù)據(jù)歸檔。
MyIASM
MyIASM是 MySQL默認(rèn)的引擎,但是它沒有提供對(duì)數(shù)據(jù)庫(kù)事務(wù)的支持,也不支持行級(jí)鎖和外鍵,因此當(dāng) INSERT(插入)或 UPDATE(更新)數(shù)據(jù)時(shí)即寫操作需要鎖定整個(gè)表,效率便會(huì)低一些。
ISAM 執(zhí)行讀取操作的速度很快,而且不占用大量的內(nèi)存和存儲(chǔ)資源。在設(shè)計(jì)之初就預(yù)想數(shù)據(jù)組織成有固定長(zhǎng)度的記錄,按順序存儲(chǔ)的。
---ISAM 是一種靜態(tài)索引結(jié)構(gòu),缺點(diǎn)是它不 支持事務(wù)處理。
Memory
Memory(也叫 HEAP)堆內(nèi)存:使用存在內(nèi)存中的內(nèi)容來(lái)創(chuàng)建表。每個(gè) MEMORY 表只實(shí)際對(duì)應(yīng)一個(gè)磁盤文件。MEMORY 類型的表訪問(wèn)非常得快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH 索引。但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會(huì)丟失掉。 Memory 同時(shí)支持散列索引和 B 樹索引,B樹索引可以使用部分查詢和通配查詢,也可以使用<,>和>=等操作符方便數(shù)據(jù)挖掘,散列索引相等的比較快但是對(duì)于范圍的比較慢很多。
索引
索引(Index)是幫助 MySQL 高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。常見的查詢算法,順序查找,二分查找,二叉排序樹查找,哈希散列法,分塊查找,平衡多路搜索樹 B 樹(B-tree)
常見索引原則
1.選擇唯一性索引
唯一性索引的值是唯一的,可以更快速的通過(guò)該索引來(lái)確定某條記錄。
2.為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引:
3.為常作為查詢條件的字段建立索引。
4.限制索引的數(shù)目:
越多的索引,會(huì)使更新表變得很浪費(fèi)時(shí)間。
5.盡量使用數(shù)據(jù)量少的索引
如果索引的值很長(zhǎng),那么查詢的速度會(huì)受到影響。
6.盡量使用前綴來(lái)索引
如果索引字段的值很長(zhǎng),最好使用值的前綴來(lái)索引。
7.刪除不再使用或者很少使用的索引
8 . 最左前綴匹配原則,非常重要的原則。
9 . 盡量選擇區(qū)分度高的列作為索引
10.區(qū)分度的公式是表示字段不重復(fù)的比例
11 .索引列不能參與計(jì)算,保持列“干凈”:帶函數(shù)的查詢不參與索引。
12 .盡量的擴(kuò)展索引,不要新建索引。
數(shù)據(jù)庫(kù)三范式
范式是具有最小冗余的表結(jié)構(gòu)。范式具體如下:
第一范式(1st NF -列都是不可再分)
第一范式的目標(biāo)是確保每列的原子性:如果每列都是不可再分的最小數(shù)據(jù)單元(也稱為最小的原子單元),則滿足第一范式(1NF)
數(shù)據(jù)庫(kù):存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
第二范式(2nd NF-每個(gè)表只描述一件事情)
首先滿足第一范式,并且表中非主鍵列不存在對(duì)主鍵的部分依賴。 第二范式要求每個(gè)表只描述一件事情。
數(shù)據(jù)庫(kù):存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
第三范式(3rd NF- 不存在對(duì)非主鍵列的傳遞依賴)
第三范式定義是,滿足第二范式,并且表中的列不存在對(duì)非主鍵列的傳遞依賴。除了主鍵訂單編號(hào)外,顧客姓名依賴于非主鍵顧客編號(hào)。
數(shù)據(jù)庫(kù):存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
數(shù)據(jù)庫(kù)是事務(wù)
事務(wù)(TRANSACTION)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,這些操作作為一個(gè)整體一起向系統(tǒng)提交,要么都執(zhí)行、要么都不執(zhí)行 。事務(wù)是一個(gè)不可分割的工作邏輯單元
事務(wù)必須具備以下四個(gè)屬性,簡(jiǎn)稱 ACID 屬性:
原子性(Atomicity)
一致性(Consistency)
當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)。隔離性(Isolation)
永久性(Durability)
存儲(chǔ)過(guò)程(特定功能的 SQL 語(yǔ)句集)
一組為了完成特定功能的 SQL 語(yǔ)句集,存儲(chǔ)在數(shù)據(jù)庫(kù)中,經(jīng)過(guò)第一次編譯后再次調(diào)用不需要再次編譯,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)中的一個(gè)重要對(duì)象。
存儲(chǔ)過(guò)程優(yōu)化思路:
盡量利用一些 sql 語(yǔ)句來(lái)替代一些小循環(huán),例如聚合函數(shù),求平均函數(shù)等。
中間結(jié)果存放于臨時(shí)表,加索引。
少使用游標(biāo)。sql 是個(gè)集合語(yǔ)言,對(duì)于集合運(yùn)算具有較高性能。而 cursors 是過(guò)程運(yùn)算。比如對(duì)一個(gè) 100 萬(wàn)行的數(shù)據(jù)進(jìn)行查詢。游標(biāo)需要讀表 100 萬(wàn)次,而不使用游標(biāo)則只需要少量幾次讀取。
事務(wù)越短越好。sqlserver 支持并發(fā)操作。如果事務(wù)過(guò)多過(guò)長(zhǎng),或者隔離級(jí)別過(guò)高,都會(huì)造成并發(fā)操作的阻塞,死鎖。導(dǎo)致查詢極慢,cpu 占用率極地。
使用 try-catch 處理錯(cuò)誤異常。
觸發(fā)器(一段能自動(dòng)執(zhí)行的程序)
觸發(fā)器是一段能自動(dòng)執(zhí)行的程序,是一種特殊的存儲(chǔ)過(guò)程,觸發(fā)器和普通的存儲(chǔ)過(guò)程的區(qū)別是:觸發(fā)器是當(dāng)對(duì)某一個(gè)表進(jìn)行操作時(shí)觸發(fā)。諸如:update、insert、delete 這些操作的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用執(zhí)行該表上對(duì)應(yīng)的觸發(fā)器。SQL Server 2005 中觸發(fā)器可以分為兩類:DML 觸發(fā)器和DDL 觸發(fā)器,其中 DDL 觸發(fā)器它們會(huì)影響多種數(shù)據(jù)定義語(yǔ)言語(yǔ)句而激發(fā),這些語(yǔ)句有 create、alter、drop 語(yǔ)句。
數(shù)據(jù)庫(kù)并發(fā)策略
并發(fā)控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時(shí)間戳。
樂觀鎖
樂觀鎖認(rèn)為一個(gè)用戶讀數(shù)據(jù)的時(shí)候,別人不會(huì)去寫自己所讀的數(shù)據(jù);悲觀鎖就剛好相反,覺得自己讀數(shù)據(jù)庫(kù)的時(shí)候,別人可能剛好在寫自己剛讀的數(shù)據(jù),其實(shí)就是持一種比較保守的態(tài)度;時(shí)間戳就是不加鎖,通過(guò)時(shí)間戳來(lái)控制并發(fā)出現(xiàn)的問(wèn)題。
悲觀鎖
悲觀鎖就是在讀取數(shù)據(jù)的時(shí)候,為了不讓別人修改自己讀取的數(shù)據(jù),就會(huì)先對(duì)自己讀取的數(shù)據(jù)加鎖,只有自己把數(shù)據(jù)讀完了,才允許別人修改那部分?jǐn)?shù)據(jù),或者反過(guò)來(lái)說(shuō),就是自己修改某條數(shù)據(jù)的時(shí)候,不允許別人讀取該數(shù)據(jù),只有等自己的整個(gè)事務(wù)提交了,才釋放自己加上的鎖,才允許其他用戶訪問(wèn)那部分?jǐn)?shù)據(jù)。
時(shí)間戳
時(shí)間戳就是在數(shù)據(jù)庫(kù)表中單獨(dú)加一列時(shí)間戳,比如“TimeStamp”,每次讀出來(lái)的時(shí)候,把該字段也讀出來(lái),當(dāng)寫回去的時(shí)候,把該字段加1,提交之前 ,跟數(shù)據(jù)庫(kù)的該字段比較一次,如果比數(shù)據(jù)庫(kù)的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數(shù)據(jù)庫(kù)系統(tǒng)提供的鎖機(jī)制,但是這種方法可以大大提高數(shù)據(jù)庫(kù)處理的并發(fā)量,以上悲觀鎖所說(shuō)的加“鎖”,其實(shí)分為幾種鎖,分別是:排它鎖(寫鎖)和共享鎖(讀鎖)。
數(shù)據(jù)庫(kù)鎖
行級(jí)鎖
行級(jí)鎖是一種排他鎖,防止其他事務(wù)修改此行;在使用以下語(yǔ)句時(shí),Oracle 會(huì)自動(dòng)應(yīng)用行級(jí)鎖:
INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];
SELECT … FOR UPDATE 語(yǔ)句允許用戶一次鎖定多條記錄進(jìn)行更新
表級(jí)鎖
表示對(duì)當(dāng)前操作的整張表加鎖,它實(shí)現(xiàn)簡(jiǎn)單,資源消耗較少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 與 INNODB 都支持表級(jí)鎖定。表級(jí)鎖定分為表共享讀鎖(共享鎖)與表獨(dú)占寫鎖
(排他鎖)。
頁(yè)級(jí)鎖
頁(yè)級(jí)鎖是 MySQL 中鎖定粒度介于行級(jí)鎖和表級(jí)鎖中間的一種鎖。表級(jí)鎖速度快,但沖突多,行級(jí)沖突少,但速度慢。所以取了折衷的頁(yè)級(jí),一次鎖定相鄰的一組記錄。BDB 支持頁(yè)級(jí)鎖
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:Mysql數(shù)據(jù)庫(kù)的存儲(chǔ)引擎有哪些-創(chuàng)新互聯(lián)
地址分享:http://jinyejixie.com/article36/csojsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、電子商務(wù)、服務(wù)器托管、品牌網(wǎng)站制作、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容