MySQL 原理篇html
MySQL 索引機制mysql
MySQL InnoDB 實現高併發原理socket
MySQL 體系結構圖:
MySQL 從概念上分爲四層,這四層自頂向下分別是網絡鏈接層,服務層(核心層),存儲引擎層,系統文件層。咱們自頂向下開始講解。
主要負責鏈接管理、受權認證、安全等等。每一個客戶端鏈接都對應着服務器上的一個線程。服務器上維護了一個線程池,避免爲每一個鏈接都建立銷燬一個線程。當客戶端鏈接到 MySQL 服務器時,服務器對其進行認證。能夠經過用戶名與密碼認證,也能夠經過 SSL 證書進行認證。登陸認證後,服務器還會驗證客戶端是否有執行某個查詢的操做權限。這一層並非 MySQL 所特有的技術。
第二層服務層是 MySQL 的核心,MySQL 的核心服務層都在這一層,查詢解析,SQL 執行計劃分析,SQL 執行計劃優化,查詢緩存。以及跨存儲引擎的功能都在這一層實現:存儲過程,觸發器,視圖等。
負責 MySQL 中數據的存儲與提取。 服務器中的查詢執行引擎經過 API 與存儲引擎進行通訊,經過接口屏蔽了不一樣存儲引擎之間的差別。MySQL 採用插件式的存儲引擎。MySQL 爲咱們提供了許多存儲引擎,每種存儲引擎有不一樣的特色。咱們能夠根據不一樣的業務特色,選擇最適合的存儲引擎。若是對於存儲引擎的性能不滿意,能夠經過修改源碼來獲得本身想要達到的性能。
各個存儲引擎的描述參考下文。
特色:
文件系統,數據、日誌(redo,undo)、索引、錯誤日誌、查詢記錄、慢查詢等,詳細參考下文的物理文件描述。
好比該層將數據庫的數據存儲在文件系統之上,並完成與存儲引擎的交互。在 MySQL 索引機制 中有講到 Myisam 和 InnoDB 的文件結構內容。
下面簡單介紹一下 MySQL 中常見的的存儲引擎
數據存儲以 CSV 文件。
特色:
flush table XXX
命令應用場景:
壓縮協議進行數據的存儲,數據存儲爲 ARZ 文件格式。
特色:
應用場景:
數據都是存儲在內存中,IO 效率要比其餘引擎高不少,服務重啓數據會丟失,內存數據表默認只有 16M,通常咱們不會使用到 Memory 存儲引擎。
特色:
應用場景:
MySQL5.5 版本以前的默認存儲引擎,較多的系統表也仍是使用這個存儲引擎,系統臨時表也會用到 MyISAM 存儲引擎。
特色:
應用場景:
MySQL 5.5 及之後版本的默認存儲引擎。
特色:
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
B-tree indexes | Yes | Yes | Yes | No | No |
Backup/point-in-time recovery(note 1) | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | Yes (note 2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
Foreign key support | No | No | Yes | No | Yes (note 5) |
Full-text search indexes | Yes | No | Yes (note 6) | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
Hash indexes | No | Yes | No (note 8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
物理文件包括:日誌文件,數據文件,配置文件,pid 文件,socket 文件等
MySQL 5.7 日誌文件介紹:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html
Log Type | Information Written to Log |
Error log | Problems encountered starting, running, or stopping mysqld |
General query log | Established client connections and statements received from clients |
Binary log | Statements that change data (also used for replication) |
Relay log | Data changes received from a replication master server |
Slow query log | Queries that took more than long_query_time seconds to execute |
DDL log (metadata log) | Metadata operations performed by DDL statements |
MySQL 錯誤日誌記錄 MySQL 運行過程當中較爲嚴重的警告和錯誤信息,以及 MySQL 每次啓動和關閉的詳細信息。MySQL 錯誤日誌默認是開啓的。
能夠經過 MySQL 配置文件中的 log-error=/var/log/mysqld.log 配置,修改錯誤日誌的配置信息。
能夠經過以下 SQL 查看錯誤日誌的詳細信息:
show variables like '%log_err%';
記錄創建的客戶端鏈接和執行的語句。
能夠經過以下 SQL 查看當前的通用日誌是否開啓:
SHOW VARIABLES LIKE '%general%';
/*開啓通用日誌查詢:*/ set global general_log = on; /*關閉通用日誌查詢:*/ set global general_log = off;
MySQL 的二進制日誌(binary log)是一個二進制文件,主要用於記錄修改數據或有可能引發數據變動的 MySQL 語句。二進制日誌(binary log)中記錄了對 MySQL 數據庫執行更改的全部操做,而且記錄了語句發生時間、執行時長、操做數據等其它額外信息,可是它不記錄 SELECT、SHOW 等那些不修改數據的 SQL 語句。二進制日誌(binary log)主要用於數據庫恢復和主從複製,以及審計(audit)操做。
/*刪除全部二進制文件:*/ reset master /*刪除部分二進制文件:*/ purge master logs /*查看是否啓用二進制日誌:*/ show variables like '%log_bin%'; /*查看全部的二進制參數*/ show variables like '%binlog%'; /*查看文件的位置*/ show variables like '%datadir%'; /*查看當前服務器全部的二進制日誌文件*/ show binary logs; show master logs;
記錄全部執行時間超過 long_query_time 秒的查詢 SQL 或者沒有使用索引的查詢 SQL,默認狀況下,MySQL 不開啓慢查詢日誌,long_query_time 的默認值爲10,即運行時間超過 10s 的語句是慢查詢語句。
/*查看當前慢查詢日誌的開啓狀況:*/ show variables like '%query%';
Linux下 MySQL 的配置文件是 my.cnf,通常會存放在 /etc/my.cnf,/etc/mysql/my.cnf,MySQL 全部的配置信息都存放在該文件中,後面會單獨整理一篇 MySQL 的配置內容介紹。
獲取硬盤中數據存儲的地址:
SHOW VARIABLES LIKE 'datadir';
根目錄文件內容:
engine 數據庫文件內容:
該文件記錄這個庫的默認使用的字符集和校驗規,文件存放在所屬數據庫的目錄下。
不論使用什麼存儲引擎,每一張表都會有一個以表名命名的 .frm 文件,與表相關的元數據(meta)信息都存放在此文件中,包括表結構的定義信息等,文件存放在所屬數據庫的目錄下。
MyISAM 存儲引擎專用,存放 MyISAM 表的數據(data)。每一張 MyISAM 表都會有一個 .MYD 文件,文件存放在所屬數據庫的目錄下。
也是 MyISAM 存儲引擎專用,存放 MyISAM 表的索引相關信息。每一張 MyISAM 表對應一個 .MYI 文件,文件存放在所屬數據庫的目錄下。
存放 InnoDB 的數據文件(包括索引)。InnoDB 存儲引擎有兩種表空間方式:獨享表空間和共享表空間。
獨享表空間:使用 .ibd 文件來存放數據,且每一張 InnoDB 表對應一個 .ibd 文件,文件存放在所屬數據庫的目錄下。
共享表空間:使用 .ibdata 文件,全部表共同使用一個(或多個,自行配置).ibdata 文件。
系統表空間(數據文件)undo 段,文件存放在 datadir 目錄下。
redlog 文件,文件存放在 datadir 目錄下。
pid 文件是 mysqld 應用程序在 Unix/Linux 環境下的一個進程文件,和許多其餘 Unix/Linux 服務端程序同樣,它存放着本身的進程 id。
socket 文件也是在 Unix/Linux 環境下才有的,用戶在 Unix/Linux 環境下客戶端鏈接能夠不經過 TCP/IP 網絡而直接使用 Unix Socket 來鏈接 MySQL。