
1. MySQL架構
1.1 邏輯架構圖

1.1.1 Connection Pool: 連接池
* 管理緩沖用戶連接,執行緒處理等需要快取的需求,
* 負責監聽對 MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到執行緒管理模塊,每一個連接上 MySQL Server 的客戶端請求都會被分配(或創建)一個連接執行緒為其單獨服務,
* 而連接執行緒的主要作業就是負責 MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞 Server 端的結果資訊等,執行緒管理模塊則負責管理維護這些連接執行緒,包括執行緒的創建,執行緒的 cache 等,
1.1.2 Parser: 決議器
* SQL命令傳遞到決議器的時候會被決議器驗證和決議,
主要功能:
a . 將SQL陳述句進行語意和語法的分析,分解成資料結構,然后按照不同的操作型別進行分類,然后做出針對性的轉發到后續步驟,以后SQL陳述句的傳遞和處理就是基于這個結構的,
b. 如果在分解構成中遇到錯誤,那么就說明這個sql陳述句是不合理的
1.1.3 Optimizer: 查詢優化器
* SQL陳述句在查詢之前會使用查詢優化器對查詢進行優化,
* 它使用的是“選取-投影-聯接”策略進行查詢,
用一個例子就可以理解: select uid,name from user where gender = 1;
* 這個select 查詢先根據where 陳述句進行選取,而不是先將表全部查詢出來以后再進行過濾
* 這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以后再進行過濾
* 將這兩個查詢條件聯接起來生成最終查詢結果
1.1.4 Cache和Buffer: 查詢快取
他的主要功能是將客戶端提交給MySQL的 select請求的回傳結果集 cache 到記憶體中,與該 query 的一個 hash 值 做一個對應,該 Query 所取資料的基表發生任何資料的變化之后, MySQL 會自動使該 query 的Cache 失效,在讀寫比例非常高的應用系統中, Query Cache 對性能的提高是非常顯著的,當然它對記憶體的消耗也是非常大的,
如果查詢快取有命中的查詢結果,查詢陳述句就可以直接去查詢快取中取資料,這個快取機制是由一系列小快取組成的,比如表快取,記錄快取,key快取,權限快取等
1.1.5 存盤引擎介面
存盤引擎介面模塊可以說是 MySQL 資料庫中最有特色的一點了,目前各種資料庫產品中,基本上只有 MySQL 可以實作其底層資料存盤引擎的插件式管理,這個模塊實際上只是 一個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天 MySQL 可插拔存盤引擎的特色,
注意:存盤引擎是基于表的,而不是資料庫,
1.2 MySQL的存盤引擎
* 多存盤引擎是mysql有別于其他資料庫的一大特性;
* 存盤引擎是針對表的
* MySQL 5.5之后,默認的存盤引擎由MyISAM變為InnoDB,
* MySQL引擎: 可以理解為,MySQL的“檔案系統”,只不過功能更加強大,
* MySQL引擎功能: 除了可以提供基本的存取功能,還有更多功能事務功能、鎖定、備份和恢復、優化以及特殊功能,
* 查看存盤引擎:show engines;
|
|
Innodb |
Myisam |
|
存盤檔案 |
.frm 表定義檔案 .ibd 資料檔案 |
.frm 表定義檔案 .myd資料檔案 .myi 索引檔案 |
|
鎖 |
表鎖、行鎖 |
表鎖 |
|
事務 |
ACID |
不支持 |
|
CRDU |
讀、寫 |
讀多 |
|
count |
掃表 |
專門存盤的地方 |
|
索引結構 |
B+ Tree |
B+ Tree |
1.3 MySQL物理結構
1.3.1 日志檔案
MySQL通過日志記錄了資料庫操作資訊和錯誤資訊,常用的日志檔案包括錯誤日志、二進制日志、查詢日志、慢查詢日志和 InnoDB 引擎在線 Redo 日志、中繼日志等,
錯誤日志(error log):記錄mysql服務器mysqld在啟動/關倍訓運行程序中遇到的錯誤資訊,(默認是開啟的,而且從5.5.7以后無法關閉錯誤日志)
查詢日志(query log):
普通查詢日志(general query log):記錄客戶端連接資訊和執行的sql陳述句資訊,(默認情況下通用查詢日志是關閉的,)
慢查詢日志(slow query log):記錄執行時間超出指定值(long_query_time)的sql陳述句,(默認是關閉的,需要通過設定:slow_query_log=ON進行開啟,)
二進制日志(binary log):記錄資料被修改的相關資訊,(默認是關閉的,需要通過配置:log-bin=mysql-bin進行開啟)
在組態檔中進行配置各日志路徑
1.3.2 資料檔案
查看MySQL資料檔案:SHOW VARIABLES LIKE ‘%datadir%’;
l .frm檔案:主要存放與表相關的資料資訊,主要包括表結構的定義資訊
l .ibd和.ibdata檔案:用來存盤InnoDB存盤引擎的表資料和索引資訊
l .myd檔案:主要用來存盤使用MyISAM存盤引擎的表資料資訊,
l .myi檔案:主要用來存盤使用MyISAM存盤引擎的表資料檔案中任何索引的資料樹,
2. MySQL索引
一般情況下,在沒有建立索引的時候,mysql需要掃描全表及掃描10W條資料找這條資料,如果我在nickname上建立索引,那么mysql只需要掃描一行資料及為我們找到這條nickname='css'的資料,是不是感覺性能提升了好多咧....
mysql的索引分為單列索引(主鍵索引,唯一索引,普通索引)和組合索引.
單列索引:一個索引只包含一個列,一個表可以有多個單列索引.
組合索引:一個組合索引包含兩個或兩個以上的列,
2.1 索引的創建
2.1.1 單列索引
1. 普通索引,這個是最基本的索引
其sql格式是 :
CREATE INDEX IndexName ON `TableName`(`欄位名`(length))
或者
ALTER TABLE TableName ADD INDEX IndexName(`欄位名`(length))
2. 唯一索引,與普通索引類似,但是不同的是唯一索引要求所有的類的值是唯一的,這一點和主鍵索引一樣.但是他允許有空值,
其sql格式是 :
CREATE UNIQUE INDEX IndexName ON `TableName`(`欄位名`(length));
或者
ALTER TABLE TableName ADD UNIQUE (column_list)
3. 主鍵索引,不允許有空值,(在B+TREE中的InnoDB引擎中,主鍵索引起到了至關重要的地位)
主鍵索引建立的規則是 int優于varchar,一般在建表的時候創建,最好是與表的其他欄位不相關的列或者是業務不相關的列.一般會設為 int 而且是 AUTO_INCREMENT自增型別的
2.1.2 組合索引
一個表中含有多個單列索引不代表是組合索引,通俗一點講 組合索引是:包含多個欄位但是只有索引名稱
其sql格式是 :
CREATE INDEX IndexName On `TableName`(`欄位名`(length),`欄位名`(length),...);
2.2 索引的洗掉
洗掉索引的mysql格式 :
DORP INDEX IndexName ON `TableName`;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/90888.html
標籤:MySQL
