mysql2模組 Mysql架構與內部模組 第二章

2021-10-17 22:20:41 字數 1517 閱讀 1759

接上文,上文簡述到了mysql中的查詢快取和解析器,今日我們繼續。

先來看一段sql:select * from `jianghuadong`;

先假設我們資料庫中並沒有一張名為jianghuadong的表,那麼這句語句的執行結果是?

首先,這句sql肯定格式上是沒有任何問題的,問題在於查詢的表不存在。也就是你的sql從語義上存在問題。

預處理器

根據以上情況,預處理器會確保欲執行的sql從語義上沒有錯誤,比如:表名,別名,許可權等幾個方面去確保sql正確。

別名錯誤舉例:select b from `jianghuadong` as a;

許可權就是比如你的當前賬號只有select許可權,但是你打算執行一條update語句,那麼預處理器會阻止你幹這件蠢事。

至此,我們的圖在增加乙個模組:

優化器思考乙個問題,給出一條sql語句:select * from `member_info` where age > 21 and *** = 1;

這條sql語句由客戶端傳送到mysql server ,是否server在真正執行的時候,一定就是這條語句?

實際上,mysql server在執行之前,會有乙個叫做優化器的元件,對你的sql進行優化重組,列出盡可能多的語句,然後選擇優化器認為最優(基於成本)的一條進行執行,但是返回的結果

肯定是與你傳送給mysql server的執行結果是一致的。

不只是mysql,市面上的資料庫基本都包含優化器模組。

優化器最主要的作用是優化,比如當你需要聯合查詢的時候,select a from a join b ...; 這個時候,到底是先查詢a表還是b表,是由優化器決定的。

其次,優化器還決定了索引的選擇,當一張表存在多個索引的時候,查詢時使用哪個索引,也是由優化器決定。

當你的sql經過優化器進行了一系列的優化後,會生成乙個叫做執行計畫的資料結構,到底先查詢哪張表,使用哪個索引。

實際上,這個執行計畫我們是可以檢視的,在sql語句前加入 explain 命令,舉例說明:

查詢member_info表,可以看到結果中有很多列,包含預計使用索引,實際使用索引等等,這些列的含義我們後面會詳細說明,此處只是簡單介紹執行計畫的作用。

如果你是5.7以上版本,可以新增上format=json執行:explain format=json select * from member_info; 檢視更加詳細的資訊。

思考乙個問題:我們在mysql上的資料,到底是放在**?

從我們的角度,或者邏輯上來說,是放在表中,也可以說是檔案。

儲存引擎

儲存引擎是mysql中比較重要的一環,內容較多,我們另開一章專門聊聊儲存引擎。

學習之路 MySQL(2)

看完上篇部落格之後,應該mysql的開發環境都配置好了,現在入正題,學習下mysql的用法 一 mysql的語句規範 1 關鍵字與函式名稱是要全部大寫的,例如 show alter 2 資料名稱,欄位名稱,表名稱是要全部小寫的 3 sql語句必須以英文分號 結尾 二 對資料進行操作 通俗的說,就是找...

MySQL(2) 關聯對映

1.多表的關係,一對一,一對多,多對多 2.實現關聯的方法 3.以mysql舉例 建立country表 主鍵是name 建立presidengt表 主鍵是name 對應關係 乙個國家對應乙個 乙個 對應乙個國家。country表中的name對應president表中的f country name。指...

mysql(2)許可權管理

1.初始化完成之後的使用者 只有乙個root使用者,5.6及之前的版本是沒有密碼的,5.7會產生隨機密碼,在初始化時可以看到,在配置日誌檔案中也可以檢視。2.使用者的許可權管理步驟 1 檢查使用者的 hip和使用者名稱是否被允許 2 檢視mysql.user表是否存在該使用者,這裡沒有許可權設定,預...