【MySQL源码】01 MySQL源码总述
目錄
- 1. 版本關(guān)系
- 2. MySQL MariaDB 安裝
- 2.1. MariaDB安裝
- 2.1.1. 源碼編譯安裝
- 2.2. docker運(yùn)行
- 2.3. 安裝MySQL
- 2.1. MariaDB安裝
- 3. 文件目錄 & 類(lèi) 概述
- 3.1. 文件
- 3.1.1. 頭文件
- 3.2. 類(lèi)
- 3.1. 文件
- 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)系
參考:
2. MySQL MariaDB 安裝
2.1. MariaDB安裝
2.1.1. 源碼編譯安裝
使用源碼編譯后進(jìn)行安裝;
參考:
2.2. docker運(yùn)行
安裝高版本MariaDB
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
參考:
3. 文件目錄 & 類(lèi) 概述
3.1. 文件
參考:
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ò)程
解析器:
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
參考:
5. MySQL語(yǔ)句 成員分析
5.1. 語(yǔ)句解析過(guò)程
參考:
下文只對(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ǔ)句
參考:
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)
具體存儲(chǔ)方式
select子句,from子句,where子句中出現(xiàn)子查詢(xún)(subselect)的情況:
總的執(zhí)行順序:
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > UNION > ORDER BY > LIMIT
參考:
總結(jié)
以上是生活随笔為你收集整理的【MySQL源码】01 MySQL源码总述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中介管理系统php源代码,PHP房产中介
- 下一篇: linux cmake编译源码,linu