以前在上一家公司的時候,沒有使用過MySQL,都是使用的SQL Server,雖然同樣有作過數據庫存儲過程的優化,可是對於底層實現,內部原理是沒有了解的,因此決定系統性的學習下MySQL,而且記錄下學習過程當中遇到的問題和一些心得體會,但願你們可以一塊兒探討,幫忙斧正。mysql
主要的學習資料:sql
1.鏈接器
鏈接器負責經過端口ip 端口號port 用戶名user和密碼pwd來鏈接到對應的server上
命令行中命令以下
mysql -h[ip] -**P**[port] -u[user] -p([pwd])
本地訪問ip&port都可省略 最好使用將密碼單獨key入的形式防止泄露數據庫
鏈接也分爲長鏈接和短鏈接,推薦使用長鏈接
複製代碼
2.查詢緩存
經常使用於表數據不怎麼發生變化的配置表中,表上有更新時,就會所有清空該表上的緩存 在mysql 8.0以後的版本中已經刪除
在以前的版本可使用, 設置query_cache_type -> DEMAND緩存
mysql> select SQL_CACHE * FROM T WHERE ...
複製代碼
3.分析器
根據輸入進行詞法分析 完成語法規則的修正 當發現錯誤時,通常會在第一處錯誤的地點拋出bash
You hava an error in your SQL syntax..
複製代碼
4.優化器
決定使用哪條索引,以及 表聯join的順序 5.執行器 判斷是否有執行權限 而後向存儲引擎發起請求,最終返回結果給到客戶端
當執行的是更新(插入/刪除)語句的時候
將更新操做分別寫入redolog和binlog用於備份
redolog 是由存儲引擎層產生 環形數據結構,大小固定
binlog 由Server層產生,數據大小可追加寫入
引擎層寫入redolog後,redolog處於prepare狀態,Server層生成該操做的binlog寫入磁盤後,將這條redolog更新爲commit狀態,更新才完成,以這樣的兩階段提交來保證兩份日誌之間的邏輯數據一致數據結構
ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)
原子性保證該事務要麼所有完成,要麼所有不完成
一致性保證在事務開始以前到結束以後,數據庫的完整性約束沒有被破壞
隔離性保證每一個事務對其餘事務的操做是能夠分離的,不依賴於其餘事務
持久性保證一旦提交,其結果是永久性的 同時存在不一樣的隔離級別 包括1.讀未提交,2.讀提交,3.可重複讀,4.串行化性能
索引是爲了提供查詢數據的效率學習
MySQL默認採用的是B+樹(多叉樹) 每一個索引即對應的一顆B+樹,主鍵索引的葉子節點存儲的是整行數據,而非主鍵索引的葉子節點內容則是主鍵值。因此常用主鍵索引來減小查詢樹的次數。 由於B+樹的有序性致使,每次在插入新row是須要對索引進行必要的維護,因此更爲推薦有序的自增索引做爲主鍵,而少使用業務主鍵。優化
最左前綴原則--能夠是聯合索引的最左N個字段,也能夠是字符串索引的最左M個字符 若是能夠經過調整順序而少創建一個索引,那這個順序每每須要優先考慮。同時當聯合索引又都有單獨各自查詢時,則考慮上空間的因素更爲一般。spa