MySQL 存儲引擎詳解

概述

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

類型

MyISAM

特點

  • 不支持事務
  • 不支持外鍵
  • 查詢、插入效率高

存儲結構

每個MyISAM 存儲引擎的表在磁盤上存儲成3個文件

  • TABLE_NAME.frm - 存儲表定義
  • TABLE_NAME.MYD - (MyData) - 存儲數據
  • TABLE_NAME.MYI - 存儲索引

使用場景

  • 系統中的地區表
  • 系統中的常量表
  • 系統中的開關狀態表
  • 其它對事務沒有要求的場景

表級鎖的鎖模式

表共享讀鎖和表獨佔寫鎖MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖。

表共享讀鎖

對MyISAM表的讀操作(加讀鎖),不會阻塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,纔會執行其它進程的寫操作。

表獨佔寫鎖

對MyISAM表的寫操作(加寫鎖),會阻塞其他進程對同一表的讀和寫操作,只有當寫鎖釋放後,纔會執行其它進程的讀寫操作。

優化

併發支持

修改 /etc/my.cnf 文件

  • concurrent_insert
    在MyISAM裏讀寫操作是串行的,但當對同一個表進行查詢和插入操作時,爲了降低鎖競爭的頻率,根據concurrent_insert的設置,MyISAM是可以並行處理查詢和插入的
    • concurrent_insert = 0
      不允許併發插入功能
    • concurrent_insert = 1 (缺省)
      允許對沒有洞洞的表使用併發插入,新增的數據位於數據文件結尾
    • concurrent_insert = 2 (推薦配置)
      允許在數據文件結尾併發插入
  • max_write_lock_count
    缺省情況下,寫操作的優先級要高於讀操作的優先級,即便是先發送的讀請求,後發送的寫請求,此時也會優先處理寫請求,然後再處理讀請求。這就造成一 個問題:一旦我發出若干個寫請求,就會堵塞所有的讀請求,直到寫請求全都處理完,纔有機會處理讀請求
    • max_write_lock_count = 1
      當系統處理一個寫操作後,就會暫停寫操作,給讀操作執行的機會
  • 以下配置同時作用在 Memory 存儲引擎的表
    示例配置:low_priority_update = 1 降低修改操作的優先級
    • low_priority
      應用於DELETE、INSERT、LOAD DATA、REPLACE和UPDATE
    • high_priority
      應用於SELECT和INSERT語句
    • delayed
      應用於INSERT和REPLACE語句

SQL優化

  • DELAYED (異步insert )
    INSERT DELAYED INTO ENT_MENU (ID, `NAME`, SORT_NUM) VALUES (115, 'asfd', 3)
    
    • 優點:
      • 不需要等待新增成功, 服務器會直接返回一個 成功
    • 缺點:
      • 通過 MySQL服務端的隊列實現,如果服務不可用會存在丟失數據的風險
      • 不能返回自增長的ID

InnoDB

5.5版本後Mysql的默認數據庫,事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定。InnoDB是爲處理巨大數據量時的最大性能設計。InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它自己的緩衝池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制爲2GB的操作系統上。InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成爲Windows上MySQL的默認表。
InnoDB 給 MySQL 提供了具有事務(transaction)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)、多版本併發控制(multi-versioned concurrency control)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行級鎖(locking on row level),提供與 Oracle 類似的不加鎖讀取(non-locking read in SELECTs)。InnoDB鎖定在行級並且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因爲在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。這些特性均提高了多用戶併發操作的性能表現。在InnoDB表中不需要擴大鎖定(lock escalation),因爲 InnoDB 的行級鎖定(row level locks)適宜非常小的空間。InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。
在技術上,InnoDB 是一套放在 MySQL後臺的完整數據庫系統,InnoDB 在主內存中建立其專用的緩衝池用於高速緩衝數據和索引。
InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操作系統的文件大小,可也可以每個表使用各自獨立的表空間,只需要啓用選項 innodb_file_per_table。

特點

  • 支持ACID事務
  • 支持行級鎖定
  • InnoDB存儲引擎完全與MySQL服務器整合
  • 有自己的緩衝池
  • 表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)
  • 提供與 Oracle 類似的不加鎖讀取
  • 提供外鍵約束
  • 只有通過索引條件檢索數據,innodb纔會使用行級鎖,否則會使用表鎖

存儲結構

每個InnoDB的表在硬盤上存儲成2類文件

  • .frm - 存儲表定義 - 只有一個
  • .idb - 存儲數據信息和索引信息 - 可能有多個

使用場景

  • 需要事務支持
  • 高併發場景

鎖模式

BDB

源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性

Memory

所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的內存空間。並且其內容會在Mysql重新啓動時丟失

Merge

將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用

Archive

非常適合存儲大量的獨立的,作爲歷史記錄的數據。因爲它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差

Federated

將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分佈式應用

Cluster/NDB

高冗餘的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用

CSV

邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏爲每個數據表創建一個.CSV文件。這是一種普通文本文件,每個數據行佔用一個文本行。CSV存儲引擎不支持索引。

BlackHole

黑洞引擎,寫入的任何數據都會消失,一般用於記錄binlog做複製的中繼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章