【MySQL源码】01 MySQL源码总述
目錄
- 1. 版本關系
- 2. MySQL MariaDB 安裝
- 2.1. MariaDB安裝
- 2.1.1. 源碼編譯安裝
- 2.2. docker運行
- 2.3. 安裝MySQL
- 2.1. MariaDB安裝
- 3. 文件目錄 & 類 概述
- 3.1. 文件
- 3.1.1. 頭文件
- 3.2. 類
- 3.1. 文件
- 4. MySQL語句解析器 – lex + yacc
- 4.1. 概述
- 4.2. Lex 詞法解析器
- 4.3. yacc 語法解析器
- 5. MySQL語句 成員分析
- 5.1. 語句解析過程
- 5.2. select 語句
- 5.2.1. select 語句中子查詢處理邏輯的分析
1. 版本關系
參考:
2. MySQL MariaDB 安裝
2.1. MariaDB安裝
2.1.1. 源碼編譯安裝
使用源碼編譯后進行安裝;
參考:
2.2. docker運行
安裝高版本MariaDB
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
參考:
3. 文件目錄 & 類 概述
3.1. 文件
參考:
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. 概述
解析過程
解析器:
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
參考:
5. MySQL語句 成員分析
5.1. 語句解析過程
參考:
下文只對常用的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 語句
參考:
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子句,from子句,where子句中出現子查詢(subselect)的情況:
總的執行順序:
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > UNION > ORDER BY > LIMIT
參考:
總結
以上是生活随笔為你收集整理的【MySQL源码】01 MySQL源码总述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中介管理系统php源代码,PHP房产中介
- 下一篇: 【ArcGIS教程01】前言