mysql刪庫跑路必會姿勢(基礎篇:MySql架構與儲存引擎)
基礎篇:MySql架構與儲存引擎
邏輯架構圖:
連線層:
mysql啟動後(可以把mysql類比為一個後臺的伺服器),等待客戶端請求,當請求到來後,mysql建立一個一個執行緒處理(執行緒池則分配一個空執行緒,當然也可使用nio執行緒模型。),每個執行緒獨立,擁有獨自記憶體空間。當請求為select請求則沒有關係,但是請求為update時,多執行緒同時修改一塊記憶體,就會引發一系列問題,由此引出 “鎖“的概念。
檢視mysql當前連線數:
show VARIABLES like '%max_connections%'
修改mysql連線數為200
set GLOBAL max_connections = 200
同時當客戶端連線到mysql伺服器時,伺服器會對其進行許可權驗證,包括,ip,使用者名稱,密碼的驗證,同時還要驗證是否有對操作某一個庫,表的許可權。
SQL處理層:
show variables like '%query_cache_type%'
SET GLOBAL query_cache_size = 188888888;
是否開啟mysql查詢結果快取,預設關閉,開啟後,mysql會對查詢出來的結果進行快取,實際應用中業務資料一般不在db層快取
mysql預設開啟sql解析快取;平時我們說的sql快取,一般指的sql解析快取。
解析查詢:
mysql對客戶端傳入的sql語句會按照一定的規則進行sql解析,而後進行sql優化,最後執行優化過的sql語句。而不是直接執行。
儲存引擎:
show engines;檢視儲存引擎
MyISAM
進入show VARIABLES like 'datadir' 檢視mysql資料檔案所在路徑,發現myisam引擎會生產三個資料檔案,xxx.frm儲存表結構檔案,所有引擎都有此檔案,xxx.MYD儲存表資料檔案,xxx.MYI儲存表索引檔案
特性:
併發性
支援表級鎖,
支援全文檢索,
支援資料檔案壓縮
試用場景:
只讀類應用;
非事物行應用(資料倉庫,報表,資料)
空間類應用(座標)
Innodb
show VARIABLES like 'innodb_file_per_table' 檢視innodb表空間型別
set global innodb_file_per_table=off 設定innodb使用系統表空間
mysql5.6以前預設使用系統表空間
系統表空間無法簡單的收縮檔案大小。
獨立表空可以通過optimize table 收縮系統檔案
系統表空間會產生io瓶頸
獨立表空間可以同時向多個檔案重新整理資料
推薦使用獨立表空間
特性:
Innodb是一種事務性儲存引擎
完全支援事物的acid特性
redo Log和Undo Log
Innodb支援行級鎖(併發度更高)
試用場景
適合大多數的oltp應用。
csv
特點:
以csv格式進行資料儲存,
所有列都不能為空,
不支援索引,
可以直接對資料檔案直接編輯(直接修改文字檔案,達到修改表的目的)。
create table mycsv(id int not null,c1 VARCHAR(10) not null,c2 char(10) not null)
engine=csv;
insert into mycsv values(1,'aaa','bbb'),(2,'cccc','dddd');
修改文字資料
flush TABLES;
select * from mycsv
create index idx_id on mycsv(id)
應用場景:
需要頻繁匯入匯出表資料的場景,如財務報表類
Archive
應用場景:日誌以及資料採集。
Memory
show VARIABLES like 'max_heap_table_size' 檢視memory引擎最大空間。
使用場景:
hash索引用於查詢或者是對映表(郵編和地區對應)
用於儲存資料分析中產生的中間表
用於快取週期性聚合資料的結果表
memory資料容易丟失,所以要求資料可再生。
Ferderted
特點:提供了遠端訪問mysql伺服器上表的方法
本地不儲存資料,資料全部放到遠端伺服器上
本地需要儲存表結構和遠端伺服器的連線資訊
使用場景:邊界資料庫,表 同步
該引擎預設禁止,啟用時需增加federated引數
表明,列名需要與遠端表相同
CREATE TABLE `local_fed` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` varchar(10) NOT NULL DEFAULT '',
`c2` char(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=federated CONNECTION
='mysql://root:[email protected]:3306/remote/remote_fed'
應用篇:鎖,事物,索引
待續。。。。。。
優化篇:慢查詢,sql優化