日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【MySQL源码】01 MySQL源码总述

發布時間:2023/12/31 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL源码】01 MySQL源码总述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1. 版本關系
  • 2. MySQL MariaDB 安裝
    • 2.1. MariaDB安裝
      • 2.1.1. 源碼編譯安裝
    • 2.2. docker運行
    • 2.3. 安裝MySQL
  • 3. 文件目錄 & 類 概述
    • 3.1. 文件
      • 3.1.1. 頭文件
    • 3.2. 類
  • 4. MySQL語句解析器 – lex + yacc
    • 4.1. 概述
    • 4.2. Lex 詞法解析器
    • 4.3. yacc 語法解析器
  • 5. MySQL語句 成員分析
    • 5.1. 語句解析過程
    • 5.2. select 語句
      • 5.2.1. select 語句中子查詢處理邏輯的分析

1. 版本關系

  • MariaDB與MySQL的版本對應關系
  • 參考:

  • mysql&mariadb–Compatibility & Differences

  • 2. MySQL MariaDB 安裝

    2.1. MariaDB安裝

    2.1.1. 源碼編譯安裝

    使用源碼編譯后進行安裝;

    參考:

  • CentOS7安裝MariaDB 10.5.4
  • centos7 mariadb 10.5.5 源碼自動化安裝 shell

  • 2.2. docker運行

  • 安裝高版本MariaDB

  • 配置MariaDB的yum源設置;
  • 使用yum進行安裝或升級;
  • mariadb設置登錄密碼:

    MariaDB [(none)]> USE mysql; MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere')WHERE User='root' AND Host = 'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES;
  • 參考:
    ????1. centos7.5下yum?安裝mariadb10.3詳解


    2.3. 安裝MySQL

    • 問題:
    • mysql?數據持久化問題#?獲取鏡像docker?search?mysqldocker?pull?centos/mysql-57-centos7:5.7#?運行容器,?需要做數據掛載??//安裝啟動mysql,需要配置密碼;##?官方命令docker?run?--name?some-mysql?-e?MYSQL_ROOT_PASSWORD=my-secret-pw?-d?mysql:tag##?實踐docker?run?-d?-p?3310:3306?-v?/home/mysql/conf:/etc/mysql/conf.d?-v?/home/mysql/data:/var/lib/mysql?-e?MYSQL_ROOT_PASSWORD=123456?--name?mysql01?mysql:5.7##?連接mysql?-uroot?-p'123456'?-P3310?-h192.168.0.120

    參考:

  • docker-mysql官網

  • 3. 文件目錄 & 類 概述

    3.1. 文件

    參考:

  • MySQL是怎么在源碼層表達對象的-----Item對象及子對象解析(一)
  • MySQL源碼分析以及目錄結構    //重要;
  • 3.1.1. 頭文件

  • item.h:
    總的對象定義類,定義了’Item’類作為總的對象類,此后,本文件中定義了許多子類,來豐富和發展MySQL可以處理的對象。但此類繼承自’Parse_tree_node’類,使得對象和詞法語法解析關聯起來,這個不細述。

  • item_cmpfunc.h:
    定義了’Item_bool_func’類,繼承自’Item_int_func’類,而Item_int_func繼承自Item_func,Item_func類繼承自Item類。'Item_bool_func’類主要用于支持比較操作,如等于、大于、小于、IN、BETWEEN、是否為NULL等。

  • item_create.h:
    用戶自定義函數的創建接口。

  • item_func.h:
    定義了 Item_func類,繼承自Item類,用以支持各種函數操作。如求絕對值、求長度、取余等等。本文件中也定義了許多子類,來豐富和發展MySQL可以處理的對象。

  • item_geofunc.h:
    空間對象處理相關函數。

  • item_inetfunc.h:
    定義IPv4、IP6的處理。

  • item_sum.h:
    定義聚集函數的處理。包括MIN和MAX,但通常這2函數個是利用索引進行優化的。

  • 3.2. 類


    4. MySQL語句解析器 – lex + yacc

    4.1. 概述

  • 解析過程

  • 解析器:

  • mysql是使用了開始的bison(即yacc的開源版)作為sql語法解析器;
  • 在mysql源碼中,解析sql在sql_yacc.yy中實現,而sql_yacc.yy 借助 bison 來轉換為c文件。
  • SQL解析相關文件及關聯

  • SQL詞法解析文件:
    sql/sql_lex.h、sql/lex_token.h、sql/lex.h、sql/lex_symbol.h
    sql/gen_lex_token.cc、sql/sql_lex.cc

  • SQL語法解析文件:
    sql/sql_yacc.yy、sql/sql_yacc.cc、sql/sql_yacc.h

  • SQL語句的hint語法解析文件:
    sql/sql_hints.yy、sql/sql_hints.yy.cc


  • 4.2. Lex 詞法解析器


    4.3. yacc 語法解析器

    yacc
    bison

    參考:

  • MySQL內核源碼解讀-SQL解析一  //Bison
  • 從Mysql源代碼角度分析一句簡單sql的查詢過程 //重要

  • 5. MySQL語句 成員分析

    5.1. 語句解析過程

    參考:

  • 用mysql源碼進行SQL解析
  • 下文只對常用的select(SQLCOM_SELECT), update(SQLCOM_UPDATE), insert(SQLCOM_INSERT), delete(SQLCOM_DELETE)做一下介紹。

    • 5.1 Select語句
      對select類型的語句解析后,將結果存放在SELECT_LEX類中
      其中:
      選擇域存放在SELECT_LEX::item_list中,類型為LIST
      where域存放在SELECT_LEX::wheret中,類型為Item*
      having域存放在SELECT_LEX::having中,類型為Item*
      order域存放在SELECT_LEX::order_list中,實際類型為ORDER*
      group域存放在SELECT_LEX::group_list中,實際類型為ORDER*
      limit域存放在SELECT_LEX::select_limit中,unsigned long
      table名字域存放在SELECT_LEX::table_list中,實際類型為TABLE_LIST*
      (其中選擇域的結構請見上文中的4(1),where域和having域的解構請見上文中的4(2), 其他幾個域的解構類似于鏈表)

    • 5.2 Update語句
      對update類型的語句解析后,將結果存放在SELECT_LEX類和LEX類中
      其中:
      更新域存放在SELECT_LEX::item_list中,類型為LIST
      值域存放在LEX::value_list中,類型為LIST
      where域存放在SELECT_LEX::wheret中,類型為Item*
      table名字域存放在SELECT_LEX::table_list中,實際類型為TABLE_LIST*
      (其中更新域和值域的結構請見上文中的4(1),where域的解構請見上文中的4(2), table名字域的解構類似于鏈表)

    • 5.3 Insert語句
      對insert類型的語句解析后,將結果存放在SELECT_LEX類和LEX類中
      其中:
      插入域存放在LEX::item_list中,類型為LIST
      值域存放在LEX::many_values中,類型為LIST<LIST>
      table名字域存放在SELECT_LEX::table_list中,實際類型為TABLE_LIST*
      (其中插入域的結構請見上文中的4(1), 值域可以含有多個LIST, table名字域的解構類似于鏈表)

    • 5.4 Delete語句
      對delete類型的語句解析后,將結果存放在SELECT_LEX類中
      其中:
      where域存放在SELECT_LEX::wheret中,類型為Item*
      limit域存放在SELECT_LEX::select_limit中,unsigned long
      table名字域存放在SELECT_LEX::table_list中,實際類型為TABLE_LIST*
      (其中選擇域的結構請見上文中的4(1),where域和having域的解構請見上文中的4(2), 其他幾個域的解構類似于鏈表)


    5.2. select 語句

    參考:

  • MySQL解析器源碼分析–對select語句中子查詢處理邏輯的分析(一)
  • 5.2.1. select 語句中子查詢處理邏輯的分析

  • 主要數據結構 & 相互關系

  • select 結構

    • MySQL解析器中負責分析和存儲一個select語句信息的數據結構是st_select_lex類(MySQL中同時將該類宏定義為 SELECT_LEX);
    • 同時負責分析和存儲union關系的數據結構是st_select_lex_unit類(MySQL中同時將該類宏定義為SELECT_LEX_UNIT);
    • 而這兩個類都繼承于 st_select_lex_node類
  • SELECT_LEX類

  • 對于SELECT_LEX類,它主要是存儲一個select語句中select子句的返回列信息,from子句中的表信息,order by,group by子句的列信息等。
  • 對于本文所關心的問題,SELECT_LEX類使用繼承于st_select_lex_node類的 next指針 存儲和該select語句進行union操作的其他select語句對應的 SELECT_LEX的地址,通過該指針串成union鏈表;
  • 具體存儲方式

  • 語句 & 存儲結構//見:參考1 # 語句(SELECT ...) UNION (SELECT ... (SELECT...)...(SELECT...UNION...SELECT))1 2 3 4 5 6 7 # 數據結構------------------------------------------------------------------------level 1SELECT_LEX_UNIT(2)|+---------------+|(UNIT->slave) |SELECT_LEX(1) SELECT_LEX(3) ---SELECT_LEX(1)->next|--------------- | ------------------------------------------------------| level 2+-------------------+| |SELECT_LEX_UNIT(4) SELECT_LEX_UNIT(6)| || +--------------+| | |SELECT_LEX(4) SELECT_LEX(5) SELECT_LEX(7)------------------------------------------------------------------------
  • 解析:
  • SELECT_LEX_UNIT 負責管理處于同一級的進行 union操作 的 數個select子句對應的SELECT_LEX;
  • 指針:
  • SELECT_LEX_UNIT 通過繼承于st_select_lex_node類 的 slave指針 存儲屬于這一級的進行union操作的 第一個SELECT_LEX;
  • 這一級別其他參與union操作的SELECT_LEX,可以通過 next指針 串成的鏈表依次找到。
  • SELECT_LEX_UNIT類中的個成員變量 fake_select_lex,來保存整個union操作的order by,limit條件。
  • 子查詢(subselect)
    select子句,from子句,where子句中出現子查詢(subselect)的情況:
  • MySQL解析器會先建一個SELECT_LEX_UNIT,將此SELECT_LEX_UNIT掛在該子查詢上一級select對應的SELECT_LEX下(即該SELECT_LEX的slave指針賦值為此SELECT_LEX_UNIT對應的地址);
  • 同時新建一個SELECT_LEX和這個子查詢對應,將這個新建的SELECT_LEX掛在剛建的SELECT_LEX_UNIT下。 ----level 2;
  • 總的執行順序:
    FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > UNION > ORDER BY > LIMIT

    參考:

  • MySQL Internals Manual:12.4 Structure Of Complex Select
  • MySQL解析器源碼分析–對select語句中子查詢處理邏輯的分析(一)

  • 總結

    以上是生活随笔為你收集整理的【MySQL源码】01 MySQL源码总述的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。