MySQL主要分爲四層架構,分別是網絡鏈接層,服務層,存儲引擎層,物理層。mysql
主要負責鏈接管理,受權認證,安全等。每一個客戶端鏈接都對應着服務器上的一個線程。服務器上維護一個線程池,避免爲每一個鏈接建立和銷燬線程。當客戶端鏈接到MySQL服務器時,服務器對其進行認證。能夠經過用戶名與密碼認證,也能夠經過SSL證書進行認證。登陸認證後,服務器還會驗證客戶端是否有執行某個查詢的操做權限。web
第二層服務層是MySQL的核心,MySQL的核心服務層都在這一層,查詢解析,SQL執行計劃分析,SQL執行計劃優化,查詢緩存。以及跨存儲引擎的功能都在這一層實現:存儲過程,觸發器,視圖等。經過下圖來觀察服務層的內部結構:
sql
負責MySQL中數據的存儲與提取。 服務器中的查詢執行引擎經過API與存儲引擎進行通訊,經過接口屏蔽了不一樣存儲引擎之間的差別。MySQL採用插件式的存儲引擎。MySQL爲咱們提供了許多存儲引擎,每種存儲引擎有不一樣的特色。咱們能夠根據不一樣的業務特色,選擇最適合的存儲引擎。若是對於存儲引擎的性能不滿意,能夠經過修改源碼來獲得本身想要達到的性能。例如阿里巴巴的X-Engine,爲了知足企業的需求facebook與google都對InnoDB存儲引擎進行了擴充。數據庫
將數據放在硬盤上緩存
查看存儲引擎安全
show engines;
MyISAM存儲引擎是MySQL5.5以前的版本默認存儲引擎
MyISAM存儲引擎表由MYD(數據文件)和MYI(索引文件)組成服務器
1.併發性與鎖級別
2.表損壞修復
3.MyISAM表支持數據壓縮網絡
myisampack -b -f myIsam.MYI
版本 < MySQL5.0時默認表大小爲4G,如存儲大表則要修改MAX_Rows和AVG_ROW_LENGTH
版本 > MySQL5.0時默認支持256TB架構
1.非事務型應用
2.只讀類應用併發
MySQL5.5 及以後版本默認存儲引擎
Innodb使用表空間進行數據存儲
innodb_file_per_table
ON:獨立表空間,tablename.ibd
OFF:系統表空間:ibdataX X是一個數字
系統表空間會產生IO瓶頸,刷新數據的時候是順序進行的因此會產生文件的IO瓶頸
獨立表空間能夠同時向多個文件刷新數據
一、支持事務的ACID特性
二、Innodb支持行級鎖,能夠最大程度的支持併發
存儲引擎 | MyISAM | InnoDB |
---|---|---|
存儲結構 | 每張表被存放在三個文件: 一、frm-表格定義 二、MYD(MYData)-數據文件 三、MYI(MYIndex)-索引文件 |
全部的表都保存在同一個數 據文件中(也多是多個文 件,或者是獨立的表空間文 件),InnoDB表的大小隻 受限於操做系統文件的大 小,通常爲2GB |
存儲空間 | MyISAM可被壓縮,存儲空間較小 | InnoDB的表須要更多的內 存和存儲,它會在主內存中 創建其專用的緩衝池用於高 速緩衝數據和索引 |
可移植性、備份及恢復 | 因爲MyISAM的數據是以文 件的形式存儲,因此在跨平 臺的數據轉移中會很方便。 在備份和恢復時可單獨針對 某個表進行操做 |
免費的方案能夠是拷貝數據 文件、備份 binlog,或者 用 mysqldump,在數據量 達到幾十G的時候就相對痛 苦了 |
事務安全 | 不支持,每次查詢具備原子性 | 支持,具備事務(commit)、 回滾(rollback)和崩潰修復 能力(crash recovery capabilities)的事務安全 (transaction-safe (ACID compliant))型表 |
AUTO_INCREMENT | MyISAM表能夠和其餘字段 一塊兒創建聯合索引 |
InnoDB中必須包含只有該 字段的索引 |
SELECT | MyISAM更優 | |
INSERT | InnoDB更優 | |
UPDATE | InnoDB更優 | |
DELETE | InnoDB更優 它不會從新建 立表,而是一行一行的刪除 |
|
COUNT without WHERE | MyISAM更優。由於 MyISAM保存了表的具體行 數 |
InnoDB沒有保存表的具體 行數,須要逐行掃描統計, 就很慢了 |
COUNT with WHERE | 同樣 | 同樣,InnoDB也會鎖表 |
鎖 | 只支持表鎖 | 支持表鎖、行鎖 行鎖大幅度 提升了多用戶併發操做的新 能。可是InnoDB的行鎖, 只是在WHERE的主鍵是有 效的,非主鍵的WHERE都 會鎖全表的 |
外鍵 | 不支持 | 支持 |
FULLTEXT全文索引 | 支持 | 不支持 能夠經過使用 Sphinx從InnoDB中得到全 文索引,會慢一點 |
數據以文本方式存儲在文件中
.CSV文件存儲表內容
.CSM文件存儲表的元數據如表狀態和數據量
.frm文件存儲表結構信息
以CSV格式進行數據存儲
適合作爲數據交換的中間表
也稱HEAP存儲引擎,因此數據保存在內存中,若是MySQL服務重啓數據會丟失,可是表結構會保存下來
一、支持HASH索引和BTree索引
二、全部字段都爲固定長度 varchar(10)=char(10)
三、不支持BLOB和TEXT等大字段
四、Memory存儲引擎使用表級鎖
一、日誌型應用
二、只讀或者大部分狀況下只讀的表
三、訂單處理
大部分狀況下,InnoDB都是正確的選擇,能夠簡單地概括爲一句話「除非須要用到某些InnoDB不具有的特性,而且沒有其餘辦法能夠替代,不然都應該優先選擇InnoDB引擎。
若是應用須要事務支持,那麼InnoDB(或者XtraDB)是目前最穩定而且通過驗證的選擇
若是能夠按期地關閉服務器來執行備份,那麼備份的因素能夠忽略。反之,若是須要在線熱備份,那麼選擇
InnoDB就是基本的要求
MyISAM崩潰後發生損壞的機率比InnoDB要高不少,並且恢復速度也要慢