mysql數據庫引擎



一、innodb

1.支持事務
事務ACID(atomicity原子性、consistency一致性、isolation隔離性、durability持久性)
A:事務要么全執行,要么全不執行
C:事務執行前后,數據完整性一致
I:多用戶並發訪問數據庫時,數據庫為每個用戶創建的事務間相互隔離
D:事務一旦被提交,對數據庫中數據的改變就是持久的
四個隔離級別
1)Read uncommitted(最低級別)
臟讀:事務A讀取了事務B未提交的數據,事務B卻回滾了。
2)Read committed (可避免臟讀)
不可重復讀:針對其他事務提交前后,讀取數據本身的對比不同,(記錄的修改)
3)Repeatable read(避免臟讀,不可重復讀)
幻讀:針對其他事務提交前后,讀取的記錄的條數不同(記錄的增刪)
4)Serializable(最高級別,可避免臟讀,不可重復讀,幻讀)

2.支持行級鎖定:
僅對指定的記錄進行加鎖,這樣其它進程還是可以對同一個表中的其它記錄進行操作

3.存儲
基於磁盤的資源是InnoDB表空間數據文件和它的日志文件,
InnoDB 表的大小只受限於操作系統文件的大小

4.索引組織表
使用的聚簇索引、索引就是數據,順序存儲,因此能緩存索引,也能緩存數據
5.服務器數據備份
必須導出SQL來備份,
LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,
解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,
但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
6.使用場景
需要事務支持(具有較好的事務特性)
行級鎖定對高並發有很好的適應能力,但需要確保查詢是通過索引完成
經常更新的表,適合處理多重並發的更新請求
數據一致性要求較高
硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,盡可能減少磁盤 IO
主鍵盡可能小,避免給Secondary index帶來過大的空間負擔
避免全表掃描,因為會導致鎖表。(sql語句中含有where條件同時明確主鍵)
盡可能緩存所有的索引和數據,提高響應速度
在大批量小插入的時候,盡量自己控制事務而不要使用autocommit自動提交
合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性
避免主鍵更新,因為這會帶來大量的數據移動
7.引擎原理


二、MyISAM
1.管理非事務表,提供高速存儲和檢索,以及全文搜索能力
2.支持表級鎖定:
直接鎖定整張表,在你鎖定期間,其它進程無法對該表進行寫操作。
如果你是寫鎖(X鎖,排他鎖),則其它進程則讀也不允許直接鎖定整張表,
3.存儲
索引和數據是分開的,並且索引是有壓縮的。
在磁盤上存儲成三個文件。
.frm文件用於存儲表的定義,
.MYD文件用於存儲表的數據,
.MYI文件,存儲的是索引。
操作系統對大文件的操作是比較慢的,這樣將表分為三個文件,
那么.MYD這個文件單獨來存放數據自然可以優化數據庫的查詢等操作。
有索引管理和字段管理。
4.堆組織表
使用的是非聚簇索引、索引和文件分開,隨機存儲,只能緩存索引
5.服務器數據備份
應對錯誤編碼導致的數據恢復速度快。
MyISAM的數據是以文件的形式存儲,所以在跨平台的數據轉移中會很方便。
在備份和恢復時可單獨針對某個表進行操作
6.使用場景
不需要事務支持(不支持)
並發相對較低(鎖定機制問題)
插入修改不頻繁,查詢非常頻繁
數據一致性要求不是非常高
盡量索引(緩存機制)
調整讀寫優先級,根據實際需求確保重要操作更優先
啟用延遲插入改善大批量寫入性能
盡量順序操作讓insert數據都寫入到尾部,減少阻塞
分解大的操作,降低單個操作的阻塞時間
降低並發數,某些高並發場景通過應用來進行排隊機制
對於相對靜態的數據,充分利用Query Cache可以極大的提高訪問效率
MyISAM的Count只有在全表掃描的時候特別高效,帶有其他條件的count都需要進行實際的數據訪問
7.引擎原理






三、其他
1.如果需要執行大量的INSERT或UPDATE操作,則應該使用InnoDB,這樣可以提高多用戶並發操作的性能。
2.mysql支持三種鎖定級別,行級、頁級、表級




四、Innodb和MyIASM的引擎原理

1、Innodb

引擎的索引結構,使用B+Tree作為索引結構。
InnoDB的數據文件本身就是索引文件,數據文件本身就是按B+Tree組織的一個索引
結構,這棵樹的葉節點data域保存了完整的數據記錄,這種索引就是聚集索引。

主鍵索引:
a、因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)。b、如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵。

c、如果不存在唯一標識數據記錄的列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。


輔助索引
InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址即InnoDB的所有輔助索引都引用主鍵作為data域


2、MyIASM

引擎的索引結構:使用B+Tree作為索引結構
MyISAM索引實現:
MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址,即葉節點的data域存放的是數據記錄的地址

索引檢索的算法:
首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。

主鍵索引和輔助索引(結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復)

3、注意

對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在
MyISAM表中,可以和其他字段一起建立聯合索引。

InnoDB 中不保存表的具體行數,也就是說,執行select count() fromtable時,
InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行

數即可。注意的是,當count()語句包含where條件時,兩種表的操作是一樣的


來源:https://m.ifeng.com/miArticle?ch=ref_xmllq_hz1&version=2&aid=ucms_7q7rbVyL69F&mibusinessId=miuibrowser&env=production&ref=browser_news&s=mb&cp=cn-fenghuang-browser&docid=fenghuang_ucms_7q7rbVyL69F&itemtype=news&_miui_bottom_bar=comment&cateCode=rec&category=%E7%A7%91%E6%8A%80&traceId=69EFF0D29A24F938C25321831ABE59B6&share=social&source=liulanqi


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM