Mysql高級知識總結

### `邏輯架構概`

和其它數據庫相比,MySQL有點與衆不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在存儲引擎的架構上,
插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實際需要選擇合適的存儲引擎。
在這裏插入圖片描述
1.連接層
最上層是一些客戶端和連接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,爲通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會爲安全接入的每個客戶端驗證它所具有的操作權限。

2.服務層
2.1 Management Serveices & Utilities: 系統管理和控制工具
2.2 SQL Interface: SQL接口
接受用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用SQL Interface
2.3 Parser: 解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析。
2.4 Optimizer: 查詢優化器。
SQL語句在查詢之前會使用查詢優化器對查詢進行優化。
用一個例子就可以理解: select uid,name from user where gender= 1;
優化器來決定先投影還是先過濾。
2.5 Cache和Buffer: 查詢緩存。
如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。
這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等
3.引擎層
存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。後面介紹MyISAM和InnoDB
4.存儲層
數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。

mysql查詢流程圖

首先,mysql的查詢流程大致是:

  • mysql客戶端通過協議與mysql服務器建連接,發送查詢語句,先檢查查詢緩存,如果命中,直接返回結果,否則進行語句解析,也就是說,在解析查詢之前,服務器會先訪問查詢緩存(query cache)——它存儲SELECT語句以及相應的查詢結果集。如果某個查詢結果已經位於緩存中,服務器就不會再對查詢進行解析、優化、以及執行。它僅僅將緩存中的結果返回給用戶即可,這將大大提高系統的性能。
  • 語法解析器和預處理:首先mysql通過關鍵字將SQL語句進行解析,並生成一顆對應的“解析樹”。mysql解析器將使用mysql語法規則驗證和解析查詢;預處理器則根據一些mysql規則進一步檢查解析數是否合法。
  • 查詢優化器當解析樹被認爲是合法的了,並且由優化器將其轉化成執行計劃。一條查詢可以有很多種執行方式,最後都返回相同的結果。優化器的作用就是找到這其中最好的執行計劃。
  • 然後,mysql默認使用的BTREE索引,並且一個大致方向是:無論怎麼折騰sql,至少在目前來說,mysql最多只用到表中的一個索引。

SQL執行順序

手寫:在這裏插入圖片描述
機讀: 隨着Mysql版本的更新換代,其優化器也在不斷的升級,優化器會分析不同執行順序產生的性能消耗不同而動態調整執行順序。 下面是經常出現的查詢順序:
在這裏插入圖片描述

Mysql存儲引擎

1 如何用命令查看
看你的mysql現在已提供什麼存儲引擎:
mysql> show engines;
在這裏插入圖片描述
看你的mysql當前默認的存儲引擎:
mysql> show variables like ‘%storage_engine%’;
在這裏插入圖片描述
各個存貯引擎的介紹
1、InnoDB存儲引擎
InnoDB是MySQL的默認事務型引擎,它被設計用來處理大量的短期(short-lived)事務。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。

2、MyISAM存儲引擎
MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM不支持事務和行級鎖,有一個毫無疑問的缺陷就是崩潰後無法安全恢復。

3、Archive引擎
Archive檔案存儲引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表適合日誌和數據採集類應用。
根據英文的測試結論來看,Archive表比MyISAM表要小大約75%,比支持事務處理的InnoDB表小大約83%。

4、Blackhole引擎
Blackhole引擎沒有實現任何存儲機制,它會丟棄所有插入的數據,不做任何保存。但服務器會記錄Blackhole表的日誌,所以可以用於複製數據到備庫,或者簡單地記錄到日誌。但這種應用方式會碰到很多問題,因此並不推薦。

5、CSV引擎
CSV引擎可以將普通的CSV文件作爲MySQL的表來處理,但不支持索引。
CSV引擎可以作爲一種數據交換的機制,非常有用。
CSV存儲的數據直接可以在操作系統裏,用文本編輯器,或者excel讀取。

6、Memory引擎
如果需要快速地訪問數據,並且這些數據不會被修改,重啓以後丟失也沒有關係,那麼使用Memory表是非常有用。Memory表至少比MyISAM表要快一個數量級。

7、Federated引擎
Federated引擎是訪問其他MySQL服務器的一個代理,儘管該引擎看起來提供了一種很好的跨服務器的靈活性,但也經常帶來問題,因此默認是禁用的。

對比項 | MyISAM |范德薩

MyISAM InnoDB
不支持外鍵 支持外鍵
不支持事務 支持事務
表鎖不適合併發 行鎖適合併發
只緩存索引,不緩存真實數據 不僅緩存索引還要緩存真實數據,對內存要求較高,而且內存大小對性能有決定性的影響
適合節省資源、消耗少、簡單業務 適合併發寫、事務、更大資源

索引優化分析

性能下降SQL慢 執行時間長 等待時間長:
數據過多——分庫分表
關聯了太多的表,太多join——SQL優化
沒有充分利用到索引——建立索引
服務器調優及各個參數設置——調整my.cnf

Join圖
在這裏插入圖片描述

索引簡介

MySQL官方對索引的定義爲:**索引(Index)是幫助MySQL高效獲取數據的數據結構。可以得到索引的本質:索引是數據結構。**索引的目的在於提高查詢效率,可以類比字典,如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要a----z,如果我想找到Java開頭的單詞呢?或者Oracle開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?
你可以簡單理解爲“排好序的快速查找數據結構”。
在數據之外,數據庫系統還維護着滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。下圖就是一種可能的索引方式示例:

在這裏插入圖片描述
左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址

爲了加快Col2的查找,可以維護一個右邊所示的二叉查找樹,每個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就可以運用二叉查找在一定的複雜度內獲取到相應數據,從而快速的檢索出符合條件的記錄。

數據本身之外,數據庫還維護着一個滿足特定查找算法的數據結構,這些數據結構以某種方式指向數據,這樣就可以在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引。

一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上

索引的優缺點

有點:類似大學圖書館建書目索引,提高數據檢索的效率,降低數據庫的IO成本,通過索引列對數據進行排序,降低數據排序的成本,降低了CPU的消耗

缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因爲更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因爲更新所帶來的鍵值變化後的索引信息。實際上索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄,所以索引列也是要佔用空間的

mysql索引分類

  1. 單值索引:即一個索引只包含單個列,一個表可以有多個單列索引

    單獨建單值索引:CREATE  INDEX 索引名 ON 表名(表字段); 
    刪除索引:DROP INDEX 索引名  on 表名;
    
  2. 唯一索引:索引列的值必須唯一,但允許有空值

        單獨建唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(表字段); 
        刪除索引:DROP INDEX 索引名  on 表名;
  1. 主鍵索引:設定爲主鍵後數據庫會自動建立索引,innodb爲聚簇索引
 單獨建主鍵索引:
                LTER TABLE 表名 add PRIMARY KEY 表名(表字段);  
 刪除建主鍵索引:ALTER TABLE 表名 drop PRIMARY KEY ;  
  1. 複合索引:即一個索引包含多個列
單獨建索引:
CREATE  INDEX 索引名 ON 表名(表字段,表字段); 
刪除索引:
DROP INDEX 索引名  on 表名 ;

索引基本語法

創建CREATE  [UNIQUE ]  INDEX [indexName] ON table_name(column)) 
刪除:DROP INDEX [indexName] ON mytable; 
查看:SHOW INDEX FROM table_name\G

使用ALTER
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是唯一的,且不能爲NULL。
 
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
 
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
 
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。

哪些情況需要創建索引

  • 主鍵自動建立唯一索引
  • 頻繁作爲查詢條件的字段應該創建索引
  • 查詢中與其它表關聯的字段,外鍵關係建立索引
  • 單鍵/組合索引的選擇問題, 組合索引性價比更高
  • 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
  • 查詢中統計或者分組字段

哪些情況不要創建索引

  • 表記錄太少
  • 經常增刪改的表或者字段
  • Where條件裏用不到的字段不創建索引
  • 過濾性不好的不適合建索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章