MySQL存儲引擎
MySQL存儲引擎采用插拔式的插件方式 ,指定在表之上的,即一個庫中的每一個表都可 以指定專用的存儲引擎。不管表采用什么樣的存儲引擎,都會在數據區,產生對應 的一個frm文件(表結構定義描述文件)
CVS存儲引擎
不能使用索引,列不能為null,且不能設置自增列。
數據存儲以csv存儲,可以直接修改csv文件來修改表數據。
適合用于數據的快速導出導入,表格直接轉換成CSV。
Archive存儲引擎
只支持insert和select兩種操作。
只允許自增ID列建立索引,行級鎖,不支持事務。
可以對數據進行壓縮占用磁盤少。
適用于存儲大量數據不變的系統,如日志系統、設備信息采集系統等。
Memory存儲引擎
數據都是存儲在內存中,IO效率要比其他引擎高很多 服務重啟數據丟失,內存數據表默認只有16M。
默認hash索引(查找復雜度0(1))。
字段長度都是固定長度varchar(32)=char(32) 不支持大數據存儲類型字段如 text 。
查詢如果涉及到計算一般會采用這種存儲引擎作為臨時表存儲需計算的數據。
Myisam存儲引擎
select count操作無需進行數據的掃描; 數據(MYD)和索引(MYI)分開存儲;表級鎖 ;不支持事務
適用于讀多寫少且無事務的表。mysql部分系統表會使用此引擎。
Innodb存儲引擎
行級鎖,支持事務,支持外鍵約束,采用聚集索引存儲數據。
MySQL的sql執行流程
1.客戶端與服務端通信,采用半雙工的方式,即在任何一個時刻,要么是有服務器向客戶端發送數據,要么是客戶端向服務端發送數據,這兩個動作不能同時發生。而且一旦開始發送消息,另一端要接收完整個消息才能響應。 客戶端一旦開始接收數據沒法停下來發送指令。
2.根據sql語句查找是否存在查詢緩存,若有直接返回緩存數據。查詢緩存默認關閉,原因是:
在查詢之前必須先檢查是否命中緩存,浪費計算資源。
如果這個查詢可以被緩存,那么執行完成后,MySQL發現查詢緩存中沒有這 個查詢,則會將結果存入查詢緩存,這會帶來額外的系統消耗。
針對表進行寫入或更新數據時,將對應表的所有緩存都設置失效。
如果查詢緩存很大或者碎片很多時,這個操作可能帶來很大的系統消耗。
3.查詢優化處理。首先解析sql生成語法樹,然后對語法樹預處理,檢驗合法性和權限驗證,最后查詢優化器尋找最優的執行計劃。Mysql的查詢優化器是基于成本計算的原則。他會嘗試各種執行計劃。 數據抽樣的方式進行試驗(隨機的讀取一個4K的數據塊進行分析)。
4.存儲引擎執行計劃
5.返回客戶端。增量的返回執行結果,開始生成第一條結果時,mysql就開始往請求方逐步返回數據 。
如何查找慢sql
1.修改mysql系統變量生成慢查詢日志:
show variables like 'slow_query_log'
set global slow_query_log = on
set global slow_query_log_file = '/var/lib/mysql/gupaoedu-slow.log'
set global log_queries_not_using_indexes = on
set global long_query_time = 0.1 (秒)
2.通過mysqldumpslow工具來進行慢查詢日志分析:
mysqldumpslow -t 10 -s at /var/lib/mysql/gupaoedu-slow.log
3.使用explain 要執行的sql \G 查看sql的詳細執行計劃。