1. 程式人生 > >mysql刪庫跑路必會姿勢(基礎篇:MySql架構與儲存引擎)

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優化