MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。mysql
編寫Sql語句基本是程序開發中的平常,執行Sql在MySql中都經歷了哪些過程呢?例如:
select * from user where id=1
負責與客戶端創建鏈接、獲取權限、位置和管理鏈接。
鏈接命令:sql
mysql -h$ip -P$port -u$user -p
環節:數據庫
1. TCP握手 2. 認證你的身份 3. 獲取權限
當鏈接創建完成後就開始執行
select
語句,執行邏輯就會來到第二步:查詢緩存
MySql 在執行查詢時會先對查詢緩存進行查詢,是否以前執行過此查詢,以前執行過的語句會以key-value形式,被直接緩存在內存當中key爲語句,value是查詢結果,查詢後2種結果:緩存
1. 查詢緩存命中:直接返回結果(效率很高) 2. 查詢緩存未命中: 繼續直行後面的階段,執行完成後,執行結果會被存入查詢緩存中
大多數狀況下我會建議你不要使用查詢緩存,爲何呢?由於查詢緩存每每利大於弊優化
查詢緩存的失效很是頻繁,只要有對一個表的更新,整個表上的查詢緩存都會被清空,對於更新頻繁的表使用查詢緩存命中率就會很低,對於更新比較少的靜態表則很適用。
按需使用:spa
將MySQL參數 query_cache_type 設置爲 DEMAND 這樣SQL語句都不會使用緩存,對於須要使用查詢緩存的查詢語句能夠用SQL_CACHE顯示指定。(MySQL8.0 已經將查詢緩存模塊移除)
mysql> select SQL_CACHE * from user where id=1
若是沒有命中查詢緩存,就要開始真正執行語句了。
首先 Mysql 須要 知道你要執行什麼,因此要對sql語句作解析code
詞法分析server
你輸入的是由多個字符串和空格組成的一條 SQL 語句,MySQL 須要識別出裏面的字符串分別是什麼,表明什麼。 MySQL 從你輸入的"select"這個關鍵字識別出來,這是一個查詢語句。它也要把字符串「T」識別成「表名 T」, 把字符串「ID」識別成「列 ID」
語法分析blog
根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這SQL語句是否知足 MySQL 語法。 若是你的語句不對,就會收到「You have an erroin your SQL syntax」的錯誤提醒,好比面這個語句 select 少打了開頭的字母「s」。
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 naer 'elect * from t where ID=1' at line 1
索引
通過分析器以後,MySQL就知道你須要作什麼,在執行以前還要通過優化器的處理。
優化器是在表裏面有多個索引的時候,決定使用哪一個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序,例如這個語句執行兩個表的join:
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20
兩種方法邏輯和結果相同,可是執行效率會有不一樣,優化器就是要決定使用哪種方案。
到這裏Mysql已經知道你想要作什麼了,優化器也幫你優化了知道該怎麼作了,那麼就開始執行語句吧。
執行語句須要:
執行器根據表的引擎定義去掉用引擎接口(例:InnoDB)
無索引:
有索引
在這裏很是感謝·林曉斌·老師在極客時間發佈的文章,讓本身對數據庫有了一個好的理解。感謝各位觀衆的耐心觀看,若有錯誤請指正,謝謝!