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