做爲後端猿的咱們,不出意外天天都會和mysql打交道。除了天天寫不膩的CURD語句,關於mysql咱們應該要了解它的那些基礎知識呢?mysql
接 入 層 ----------------------- ⬆ ⬆ ⬇ ⬇ 緩 存 解 析 器 ⬆ ⬇ 優 化 器 ----------------------- 引 擎
InnoDBsql
MyISAM數據庫
Memory後端
Archive安全
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
MVCC:Multi Version Concurrency Control, 多版本併發控制,mysql防止幻讀的一種技術手段。每行數據存在間隙行,間隙行存放該行數據的建立時間,刪除時間,這裏的時間實際是事務的版本號。當,數據結構
死鎖產生的緣由是兩個事務互相等待對方釋放,產生了循環依賴,mysql採用了死鎖檢測(檢測到循環依賴返回錯誤)和死鎖超時(超時回滾持有行鎖最少的事務)的方式儘量去避免死鎖。例如:架構
行鎖: UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala'; UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala'; UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala'; UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala';
覆蓋索引:要查詢的行被索引覆蓋,從索引中能夠直接讀取,不須要回表查詢。例如:併發
CREATE TABLE `demo_table`( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `username` char(32) NOT NULL DEFAULT '' COMMENT '用戶名', `password` char(32) NOT NULL DEFAULT '' COMMENT '密碼', PRIMARY KEY (`id`), KEY `idx_username` (`username`) )ENGINE=InnoDB DEFAULT CHARSET=UTF8;
explain select `username` from `demo_table` where `username` = 'demo'; +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | 1 | SIMPLE | demo_table | ref | idx_username | idx_username | 96 | const | 1 | Using where; Using index | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
Extra裏的Using index就是使用了覆蓋索引的意思。spa
我的目前理解:例如使用聯合索引,從左向右依次匹配,未匹配到索引字段或第一個範圍查找(between、like、大於、小於)爲止,及該部分索引有效。指針
紅黑樹本質是二叉樹,每一個節點最多擁有兩個子節點,因此紅黑樹的深度較深。
B樹每一個節點最多能夠有n個子節點,根節點常駐內存且每一個節點恰好申請1個頁的大小,假如每一個節點擁有100個子節點,那百萬級的數據咱們基本上只須要深度是3就能夠存下 => 100^3,這樣就減小的io次數(一個節點的大小一般爲磁盤一個頁的大小)。
又有「局部性原理」(一旦一個數據被查詢,那麼它附近的數據可能也會須要被查詢),其次B+樹的葉子節點構成一個鏈表,這樣咱們就能夠很容易的查詢出一段範圍的數據,其次B+樹的根節點和內部節點只存放該索引下一個子節點的位置的指針,數據只存放在葉子節點裏,這樣非葉子節點就能夠有更多的空間存放索引的位置,索引的範圍就能夠儘量的大,從而樹的深度就可能的小。
後續持續修正和補充,若是有什麼寫的不對的地方歡迎你們積極指正,謝謝你們。
掃面下方二維碼關注個人技術公衆號,及時爲你們推送個人原創技術分享