一、第一節:一條sql查詢語句是怎樣執行的
5.5.5版本以后,默認使用存儲引擎為InnoDB
不使用查詢緩存,MySQL8.0沒有查詢緩存這個功能
總體來說:MySQL分為service層和存儲引擎層
1)service層包括:連接器、分析器、優化器、執行器;它涵蓋了MySQL大多數核心服務功能,以及所有的內置函數(日期、時間、數學和加密函數),所有跨存儲引擎都在這一層實現(觸發器、存儲過程、視圖)
2)存儲引擎負責數據的存儲和提取,其架構模式是插件式的,包含:InnoDB、MyISAM、Memory等5.5.5版本以后,默認使用存儲引擎為InnoDB,選擇其他引擎可以在建表時進行選擇,不同的存儲引擎用的是同一個server層
mysql> select * from T where ID=10;
(1)連接器:建立連接、獲取權限、維持和管理連接
mysql -h$ip -P$port -u$user -p
如果通過則開始驗證權限:否則 access denied for user
建立連接之后,會保持連接,處于空閑的狀態,使用 show processlist 可以查看,如果長時間沒動靜,連接器會自己斷開,wait_timeout控制,默認為8小時,
長連接是如果連接過后,客戶端一直有請求,則一直使用同一個連接,短連接則是每次執行完很少的幾次查詢之后就斷開了,下次查詢再重新進行連接;
全使用長連接之后,會大量占用內存,導致oom,解決方案:定期斷開長連接,5.7版本之后,執行一個比較大的操作之后,使用mysql_reset_connection初始化連接資源
(2)查詢緩存:MySQL接收到查詢緩存之后,會先到緩存看是否執行過相同語句,擊中則返回,否則繼續往下
一般都不建議使用緩存,8.0之后直接拋棄了這一部分的功能,why?:
查詢緩存實效非常頻繁,只要對一個表有更新操作,該表的緩存就會被清空;query_cache_type 設置為DEMAND,這樣的sql語句都不使用緩存;如需使用,如下:
mysql> select SQL_CACHE * from T where ID=10;
(3)分析器:檢查語法,分析語句:
mysql> elect * from t where ID=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1
注意near附近的提示查找到錯誤;
(4)優化器:當表有多個索引的時候,決定使用哪個索引,或者有多個表關聯的時候,決定各個表的連接順序
(5)執行器:當知道你需要做什么時,進入執行階段,開始執行語句:
mysql> elect * from t where ID=1;
開始執行時,還會判斷一下登錄用戶有沒有這張表的查詢權限 ,
慢數據中會看到rows_examined ,表示執行了多少次行掃描;