mysql執行順序、基本架構、索引

mysql語法順序和執行順序

  1. SELECT
  2. FROM
  3. LEFT JOIN
  4. ON
  5. WHERE
  6. GROUP BY
  7. HAVING
  8. ORDER BY
  9. LIMIT
  1. 執行順序

  示例SQL:

  SELECT * FROM user LEFT JOIN order ON user.id = order.uid WHERE order.price > 1000 GROUP BY user.name HAVING count(1) > 5 ORDER BY user.name LIMIT 0,10

  1. FROM(將最近的兩張表,進行笛卡爾積)---產生結果VT1
  2. ON(將VT1按照它的條件進行過濾)---產生結果VT2
  3. LEFT JOIN(保留左表的記錄)---產生結果VT3
  4. WHERE(過濾VT3中的記錄)--產生結果VT4到VTn
  5. GROUP BY(對VT4的記錄進行分組)---產生結果VT5
  6. HAVING(對VT5中的記錄進行過濾)---產生結果VT6
  7. SELECT(對VT6中的記錄,選取指定的列)--產生結果VT7
  8. ORDER BY(對VT7的記錄進行排序)--遊標控制
  9. LIMIT(對排序之後的值進行分頁)
  1. WHERE條件執行順序(影響性能)
  1. MYSQL:從左往右去執行WHERE條件的。
  2. Oracle:從右往左去執行WHERE條件的。
  1. 結論:寫WHERE條件的時候,優先級高的部分要去編寫過濾力度最大的條件語句,這樣後面的語句過濾前的結果會比較小,效率會比較高。

mysql邏輯架構

 

Connectors:指的是不同語言中與SQL的交互。

Management Serveices & Utilities:系統管理和控制工具

Connection Pool: 連接池

管理緩衝用戶連接線程處理等需要緩存的需求。負責監聽對 MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到線程管理模塊。每一個連接上 MySQL Server 的客戶端請求都會被分配(或創建)一個連接線程爲其單獨服務。而連接線程的主要工作就是負責 MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞 Server 端的結果信息等。線程管理模塊則負責管理維護這些連接線程。包括線程的創建,線程的 cache 等。

SQL Interface: SQL接口

接受用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用SQL Interface

Parser: 解析器

SQL命令傳遞到解析器的時候會被解析器驗證和解析。主要功能:a . 將SQL語句進行語義和語法的分析,分解成數據結構,然後按照不同的操作類型進行分類,然後做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的。b.  如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的

Optimizer: 查詢優化器

SQL語句在查詢之前會使用查詢優化器對查詢進行優化

它使用的是“選取-投影-聯接”策略進行查詢,  用一個例子就可以理解: select uid,name from user where gender = 1;

1.這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行過濾

2.這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾

3.將這兩個查詢條件聯接起來生成最終查詢結果

Cache和Buffer: 查詢緩存。

他的主要功能是將客戶端提交給MySQL的 select請求的返回結果集 cache 到內存中,與該 query 的一個 hash 值 做一個對應。該 Query 所取數據的基表發生任何數據的變化之後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對性能的提高是非常顯著的。當然它對內存的消耗也是非常大的。如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等

存儲引擎接口:存儲引擎是基於表的,而不是數據庫

存儲引擎接口模塊可以說是 MySQL 數據庫中最有特色的一點了。目前各種數據庫產品中,基本上只有 MySQL 可以實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是 一個抽象類,但正是因爲它成功地將各種數據處理高度抽象化,才成就了今天 MySQL 可插拔存儲引擎的特色。

     從圖還可以看出,MySQL區別於其他數據庫的最重要的特點就是其插件式的表存儲引擎。MySQL插件式的存儲引擎架構提供了一系列標準的管理和服務支持,這些標準與存儲引擎本身無關,可能是每個數據庫系統本身都必需的,如SQL分析器和優化器等,而存儲引擎是底層物理結構的實現,每個存儲引擎開發者都可以按照自己的意願來進行開發。

MySQL執行流程圖

存儲引擎:show engines;

存儲引擎是針對表的

MySQL 5.5之後,默認的存儲引擎由MyISAM變爲InnoDB

 

Innodb

Myisam

存儲文件

.frm 表定義文件

.ibd 數據文件

.frm 表定義文件

.myd 數據文件

.myi 索引文件

表鎖、行鎖

表鎖

事務

ACID

不支持

CRDU

讀、寫

讀多

count

掃表

專門存儲的地方

索引結構

B+ Tree

B+ Tree

 

 

 

MyISAM不支持事務,但是讀快,可以根據實際情況對不同的表使用不同的存儲引擎,如日誌可以使用MyISAM,業務表使用InnoDB

MySQL文件分爲日誌文件和數據文件

日誌文件包含錯誤日誌、二進制日誌、查詢日誌、慢查詢日誌和InnoDB引擎在線Redo日誌、中繼日誌等。

二進制日誌(bin-log):

默認是關閉的,需要通過配置:log-bin=mysql-bin進行開啓。其中mysql-bin是binlog日誌文件的basename,binlog日誌文件的名稱:mysql-bin-000001.log

* binlog記錄了數據庫所有的ddl語句和dml語句,但不包括select語句內容,語句以事件的形式保存,描述了數據的變更順序,binlog還包括了每個更新語句的執行時間信息,binlog主要作用是用於恢復數據,因此binlog對於災難恢復和備份恢復來說至關重要。

* 如果是DDL語句,則直接記錄到binlog日誌,而DML語句,必須通過事務提交才能記錄到binlog日誌中。

* binlog還用於實現mysql主從複製。

* binlog還用於數據恢復。

慢查詢日誌(slow query log):

* 默認是關閉的。需要通過設置:slow_query_log=ON進行開啓。

* 記錄執行時間超過long_query_time秒的所有查詢,便於收集查詢時間比較長的SQL語句

事務日誌:

* 事務日誌(InnoDB特有的日誌)也叫redo日誌。

* 文件名爲"ib_logfile0"和“ib_logfile1”,默認存放在表空間所在目錄。

* 還有一個日誌文件叫undo 日誌,默認存儲在ib_data目錄下。

中繼日誌:

* 是在主從複製環境中產生的日誌。

* 主要作用是爲了從機可以從中繼日誌中獲取到主機同步過來的SQL語句,然後執行到從機中。

數據文件

查看MySQL數據文件:SHOW VARIABLES LIKE ‘%datadir%’;

  1. .frm文件:主要存放與表相關的數據信息,主要包括表結構的定義信息
  2. .ibd和.ibdata文件:用來存儲InnoDB存儲引擎表數據和索引信息
  3. .myd文件:主要用來存儲使用MyISAM存儲引擎的表數據信息
  4. .myi文件:主要用來存儲使用MyISAM存儲引擎的表數據文件中任何索引的數據樹。

索引

MYISAM和InnoDB兩種存儲引擎都是支持b+tree索引

  1. 索引的分類

       * 單列索引:

                     * 普通索引:MySQL中基本索引類型,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。

                     * 唯一索引:索引列中的值必須是唯一的,但是允許爲空值,

                     * 主鍵索引:是一種特殊的唯一索引,不允許有空值

       * 組合索引

              * 在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合

索引的存儲結構

MYISAM的索引是存儲指向數據的地址;InnoDB的數據是存儲在主鍵索引下面,其他索引中存儲的都是主鍵的地址。

B Tree和B+ Tree的特點與區別:

* 樹的高度一般都是在2-4這個高度,樹的高度直接影響IO讀寫的次數。

* 如果是三層樹結構---支撐的數據可以達到20G,如果是四層樹結構---支撐的數據可以達到幾十T

*  B Tree和B+ Tree的最大區別在於非葉子節點是否存儲數據的問題。B Tree是非葉子節點和葉子節點都會存儲數據。而B+ Tree只有葉子節點纔會存儲數據,而且存儲的數據都是在一行上,而且這些數據都是有指針指向的,也就是由順序的。

非聚集索引(MYISAM):

* 葉子節點只會存儲數據行的指針,簡單來說數據和索引不在一起,就是非聚集索引。

 * 主鍵索引和輔助索引都會存儲指針的值

聚集索引(InnoDB):

* 主鍵索引(聚集索引)的葉子節點會存儲數據行,也就是說數據和索引是在一起,這就是聚集索引。

* 輔助索引只會存儲主鍵值

* 如果沒有沒有主鍵,則使用唯一索引建立聚集索引;如果沒有唯一索引,MySQL會按照一定規則創建聚集索引。

使用索引時的注意事項:

  1. 儘量創建組合索引(組合索引其實會默認按照最左前綴原則幫我們創建多組索引)組合索引(id,name,sex)
  2. 索引最左前綴原則
  3. 索引覆蓋:要查詢的列,也要使用索引覆蓋住
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章