Mysql插拔式的存儲引擎:html
CSV:https://dev.mysql.com/doc/refman/5.7/en/csv-storage-engine.htmlmysql
數據存儲以CSV文件,會生成3個文件 table_name.CSM(元數據狀態管理,數據行) table_name.CSV(數據文件) table_name.frm。特色:linux
不能定義沒有索引、列定義必須爲NOT NULL。sql
不能設置自增列,不適用大表或者數據的在線處理。緩存
CSV數據的存儲用,隔開,可直接編輯CSV文件進行數據的編排,數據安全性低。安全
注:編輯以後,要生效使用 flush table XXX 命令。服務器
應用場景:數據的快速導出導入,表格直接轉換成CSV。函數
Archive:https://dev.mysql.com/doc/refman/5.7/en/archive-storage-engine.html工具
會生成 table_name.ARZ table_name.frm,數據存儲爲ARZ文件格式。特色:測試
只支持 insert 和 select 兩種操做,只容許自增ID列創建索引,行級鎖,不支持事務,數據佔用磁盤少。
應用場景:日誌系統,大量的設備數據採集。
Memory(heap):https://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
數據都是存儲在內存中,IO效率要比其餘引擎高不少,服務重啓數據丟失,內存數據表默認只有16M。特色:
支持hash索引,B tree索引,默認hash(查找複雜度0(1)),字段長度都是固定長度varchar(32)=char(32),不支持大數據存儲類型字段如 blog,text,表級鎖
應用場景:等值查找熱度較高數據,查詢結果內存中的計算,大多數都是採用這種存儲引擎,做爲臨時表存儲需計算的數據。
Myisam:https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html
Mysql5.5版本以前的默認存儲引擎,較多的系統表也仍是使用這個存儲引擎,系統臨時表也會用到Myisam存儲引擎。特色:
select count(*) from table 無需進行數據的掃描,數據(MYD)和索引(MYI)分開存儲,表級鎖,不支持事務。
Innodb:https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html
在建立好表結構而且指定搜索引擎爲 Myisam以後,會在數據目錄生成3個文件,分別是table_name.frm(表結構文件),table_name.idb(數據與索引保存文件)。Mysql5.5及之後版本的默認存儲引擎
Key Advantages:Its DML operations follow the ACID model [事務ACID]。
Row-level locking[行級鎖]InnoDB tables arrange your data on disk to optimize queriesbased on primary keys[彙集索引(主鍵索引)方式進行數據存儲]。
To maintain data integrity, InnoDB supports FOREIGN KEY constraints[支持外鍵關係保證數據完整性]。
接下來看一下這些經常使用的搜索引擎的簡單對比圖,也能看出爲何InnoDB最後悔脫穎而出:
由下圖能夠看出Mysql的執行流程大體分爲 5 個階段:
咱們能夠根據執行的流程來看一下在優化的過程當中須要注意點什麼。
Mysql客戶端與服務端的通訊方式是「半雙工」的通訊方式,通訊方式主要分爲如下三種:
半雙工通訊:
在任何一個時刻,要麼是有服務器向客戶端發送數據,要麼是客戶端向服務端發送數據,這兩個動做不能同時發生。因此咱們沒法也無需將一個消息切成小塊進行傳輸
特色和限制:
客戶端一旦開始發送消息,另外一端要接收完整個消息才能響應。客戶端一旦開始接收數據無法停下來發送指令。
mysql 客戶端/服務端通訊--查詢狀態
有一整套狀態集去管理狀態。對於一個mysql鏈接,或者說一個線程,時刻都有一個狀態來標識這個鏈接正在作什麼。查看命令 show full processlist / show processlist
要了解狀態的全過程請登陸:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html (狀態全集)。如下是常見的狀態集:
異常狀況下可經過kill {id}的方式進行鏈接的殺掉
工做原理:緩存SELECT操做的結果集和SQL語句;新的SELECT語句,先去查詢緩存,判斷是否存在可用的記錄集。
判斷標準:與緩存的SQL語句,是否徹底同樣,區分大小寫 (簡單認爲存儲了一個key-value結構,key爲sql,value爲sql查詢結果集)。
能夠經過如下命令來查看緩存的設置狀況:
在my.cnf配置文件中能夠配置:
query_cache_type:
query_cache_size:容許設置query_cache_size的值最小爲40K,默認1M,推薦設置 爲:64M/128M;
query_cache_limit:限制查詢緩存區最大能緩存的查詢記錄集,默認設置爲1M
能夠經過 show status like 'Qcache%' 命令可查看緩存狀況:
須要注意的是,一旦表數據發生一點變化,與這個表所相關的緩存所有失效,不會緩存的狀況:
爲何mysql默認關閉了緩存開啓??
適用場景 :以讀爲主的業務,數據生成以後就不常改變的業務。好比門戶類、新聞類、報表類、論壇類等
查詢優化處理的三個階段:
查詢優化器如何找到最優計劃 ,經過explain +查詢sql查看執行計劃+\G。
查詢優化器如何找到最優執行計劃,有以下規則:
Mysql的查詢優化器是基於成本計算的原則。他會嘗試各類執行計劃。數據抽樣的方式進行試驗(隨機的讀取一個4K的數據塊進行分析)。
mysql查詢優化 -執行計劃:使用命令查看一句查詢SQL,看看查詢計劃中都涉及什麼有用的信息
id:select查詢的序列號,標識執行的順序
select_type:查詢的類型,主要是用於區分普通查詢、聯合查詢、子查詢等
table :查詢涉及到的表
type:訪問類型,sql查詢優化中一個很重要的指標,結果值從好到壞依次是:system > const > eq_ref > ref > range > index > ALL
執行計劃:
possible_keys:查詢過程當中有可能用到的索引
key:實際使用的索引,若是爲NULL,則沒有使用索引 rows,根據表統計信息或者索引選用狀況,大體估算出找到所需的記錄所須要讀取的行數。
filtered:它指返回結果的行佔須要讀到的行(rows列的值)的百分比。表示返回結果的行數佔需讀取行數的百分比,filtered的值越大越好。
Extra :十分重要的額外信息
調用插件式的存儲引擎的原子API的功能進行執行計劃的執行,執行計劃的好壞也是依賴於搜索引擎的。
一、有須要作緩存的,執行緩存操做。
二、增量的返回結果:開始生成第一條結果時,mysql就開始往請求方逐步返回數據。
好處: 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 (秒) //-- 執行時間超過多少爲慢日誌
能夠直接打開編輯 vi slow.log文件來查看,以下圖的信息:
慢日誌分析工具:
mysqldumpslow -t(查詢多少行) 10 -s at(平均查詢時間) /var/lib/mysql/gupaoedu-slow.log
經過返回的記錄能看到前10條執行效率比較低下的sql信息,開發者能夠經過這些信息去作相應的優化。