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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

【MySQL源码】01 MySQL源码总述

發(fā)布時(shí)間:2023/12/31 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL源码】01 MySQL源码总述 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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

1. 版本關(guān)系

  • MariaDB與MySQL的版本對(duì)應(yīng)關(guān)系
  • 參考:

  • mysql&mariadb–Compatibility & Differences

  • 2. MySQL MariaDB 安裝

    2.1. MariaDB安裝

    2.1.1. 源碼編譯安裝

    使用源碼編譯后進(jìn)行安裝;

    參考:

  • CentOS7安裝MariaDB 10.5.4
  • centos7 mariadb 10.5.5 源碼自動(dòng)化安裝 shell

  • 2.2. docker運(yùn)行

  • 安裝高版本MariaDB

  • 配置MariaDB的yum源設(shè)置;
  • 使用yum進(jìn)行安裝或升級(jí);
  • mariadb設(shè)置登錄密碼:

    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

    • 問(wèn)題:
    • mysql?數(shù)據(jù)持久化問(wèn)題#?獲取鏡像docker?search?mysqldocker?pull?centos/mysql-57-centos7:5.7#?運(yùn)行容器,?需要做數(shù)據(jù)掛載??//安裝啟動(dòng)mysql,需要配置密碼;##?官方命令docker?run?--name?some-mysql?-e?MYSQL_ROOT_PASSWORD=my-secret-pw?-d?mysql:tag##?實(shí)踐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官網(wǎng)

  • 3. 文件目錄 & 類(lèi) 概述

    3.1. 文件

    參考:

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

  • item.h:
    總的對(duì)象定義類(lèi),定義了’Item’類(lèi)作為總的對(duì)象類(lèi),此后,本文件中定義了許多子類(lèi),來(lái)豐富和發(fā)展MySQL可以處理的對(duì)象。但此類(lèi)繼承自’Parse_tree_node’類(lèi),使得對(duì)象和詞法語(yǔ)法解析關(guān)聯(lián)起來(lái),這個(gè)不細(xì)述。

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

  • item_create.h:
    用戶(hù)自定義函數(shù)的創(chuàng)建接口。

  • item_func.h:
    定義了 Item_func類(lèi),繼承自Item類(lèi),用以支持各種函數(shù)操作。如求絕對(duì)值、求長(zhǎng)度、取余等等。本文件中也定義了許多子類(lèi),來(lái)豐富和發(fā)展MySQL可以處理的對(duì)象。

  • item_geofunc.h:
    空間對(duì)象處理相關(guān)函數(shù)。

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

  • item_sum.h:
    定義聚集函數(shù)的處理。包括MIN和MAX,但通常這2函數(shù)個(gè)是利用索引進(jìn)行優(yōu)化的。

  • 3.2. 類(lèi)


    4. MySQL語(yǔ)句解析器 – lex + yacc

    4.1. 概述

  • 解析過(guò)程

  • 解析器:

  • mysql是使用了開(kāi)始的bison(即yacc的開(kāi)源版)作為sql語(yǔ)法解析器;
  • 在mysql源碼中,解析sql在sql_yacc.yy中實(shí)現(xiàn),而sql_yacc.yy 借助 bison 來(lái)轉(zhuǎn)換為c文件。
  • SQL解析相關(guān)文件及關(guān)聯(lián)

  • 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語(yǔ)法解析文件:
    sql/sql_yacc.yy、sql/sql_yacc.cc、sql/sql_yacc.h

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


  • 4.2. Lex 詞法解析器


    4.3. yacc 語(yǔ)法解析器

    yacc
    bison

    參考:

  • MySQL內(nèi)核源碼解讀-SQL解析一  //Bison
  • 從Mysql源代碼角度分析一句簡(jiǎn)單sql的查詢(xún)過(guò)程 //重要

  • 5. MySQL語(yǔ)句 成員分析

    5.1. 語(yǔ)句解析過(guò)程

    參考:

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

    • 5.1 Select語(yǔ)句
      對(duì)select類(lèi)型的語(yǔ)句解析后,將結(jié)果存放在SELECT_LEX類(lèi)中
      其中:
      選擇域存放在SELECT_LEX::item_list中,類(lèi)型為L(zhǎng)IST
      where域存放在SELECT_LEX::wheret中,類(lèi)型為Item*
      having域存放在SELECT_LEX::having中,類(lèi)型為Item*
      order域存放在SELECT_LEX::order_list中,實(shí)際類(lèi)型為ORDER*
      group域存放在SELECT_LEX::group_list中,實(shí)際類(lèi)型為ORDER*
      limit域存放在SELECT_LEX::select_limit中,unsigned long
      table名字域存放在SELECT_LEX::table_list中,實(shí)際類(lèi)型為T(mén)ABLE_LIST*
      (其中選擇域的結(jié)構(gòu)請(qǐng)見(jiàn)上文中的4(1),where域和having域的解構(gòu)請(qǐng)見(jiàn)上文中的4(2), 其他幾個(gè)域的解構(gòu)類(lèi)似于鏈表)

    • 5.2 Update語(yǔ)句
      對(duì)update類(lèi)型的語(yǔ)句解析后,將結(jié)果存放在SELECT_LEX類(lèi)和LEX類(lèi)中
      其中:
      更新域存放在SELECT_LEX::item_list中,類(lèi)型為L(zhǎng)IST
      值域存放在LEX::value_list中,類(lèi)型為L(zhǎng)IST
      where域存放在SELECT_LEX::wheret中,類(lèi)型為Item*
      table名字域存放在SELECT_LEX::table_list中,實(shí)際類(lèi)型為T(mén)ABLE_LIST*
      (其中更新域和值域的結(jié)構(gòu)請(qǐng)見(jiàn)上文中的4(1),where域的解構(gòu)請(qǐng)見(jiàn)上文中的4(2), table名字域的解構(gòu)類(lèi)似于鏈表)

    • 5.3 Insert語(yǔ)句
      對(duì)insert類(lèi)型的語(yǔ)句解析后,將結(jié)果存放在SELECT_LEX類(lèi)和LEX類(lèi)中
      其中:
      插入域存放在LEX::item_list中,類(lèi)型為L(zhǎng)IST
      值域存放在LEX::many_values中,類(lèi)型為L(zhǎng)IST<LIST>
      table名字域存放在SELECT_LEX::table_list中,實(shí)際類(lèi)型為T(mén)ABLE_LIST*
      (其中插入域的結(jié)構(gòu)請(qǐng)見(jiàn)上文中的4(1), 值域可以含有多個(gè)LIST, table名字域的解構(gòu)類(lèi)似于鏈表)

    • 5.4 Delete語(yǔ)句
      對(duì)delete類(lèi)型的語(yǔ)句解析后,將結(jié)果存放在SELECT_LEX類(lèi)中
      其中:
      where域存放在SELECT_LEX::wheret中,類(lèi)型為Item*
      limit域存放在SELECT_LEX::select_limit中,unsigned long
      table名字域存放在SELECT_LEX::table_list中,實(shí)際類(lèi)型為T(mén)ABLE_LIST*
      (其中選擇域的結(jié)構(gòu)請(qǐng)見(jiàn)上文中的4(1),where域和having域的解構(gòu)請(qǐng)見(jiàn)上文中的4(2), 其他幾個(gè)域的解構(gòu)類(lèi)似于鏈表)


    5.2. select 語(yǔ)句

    參考:

  • MySQL解析器源碼分析–對(duì)select語(yǔ)句中子查詢(xún)處理邏輯的分析(一)
  • 5.2.1. select 語(yǔ)句中子查詢(xún)處理邏輯的分析

  • 主要數(shù)據(jù)結(jié)構(gòu) & 相互關(guān)系

  • select 結(jié)構(gòu)

    • MySQL解析器中負(fù)責(zé)分析和存儲(chǔ)一個(gè)select語(yǔ)句信息的數(shù)據(jù)結(jié)構(gòu)是st_select_lex類(lèi)(MySQL中同時(shí)將該類(lèi)宏定義為 SELECT_LEX);
    • 同時(shí)負(fù)責(zé)分析和存儲(chǔ)union關(guān)系的數(shù)據(jù)結(jié)構(gòu)是st_select_lex_unit類(lèi)(MySQL中同時(shí)將該類(lèi)宏定義為SELECT_LEX_UNIT);
    • 而這兩個(gè)類(lèi)都繼承于 st_select_lex_node類(lèi)
  • SELECT_LEX類(lèi)

  • 對(duì)于SELECT_LEX類(lèi),它主要是存儲(chǔ)一個(gè)select語(yǔ)句中select子句的返回列信息,from子句中的表信息,order by,group by子句的列信息等。
  • 對(duì)于本文所關(guān)心的問(wèn)題,SELECT_LEX類(lèi)使用繼承于st_select_lex_node類(lèi)的 next指針 存儲(chǔ)和該select語(yǔ)句進(jìn)行union操作的其他select語(yǔ)句對(duì)應(yīng)的 SELECT_LEX的地址,通過(guò)該指針串成union鏈表;
  • 具體存儲(chǔ)方式

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

    參考:

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

  • 總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。