一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL的整體邏輯架構(gòu)

馬哥Linux運(yùn)維 ? 來(lái)源:cnblogs ? 2024-04-30 11:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

支持多種存儲(chǔ)引擎是眾所周知的MySQL特性,也是MySQL架構(gòu)的關(guān)鍵優(yōu)勢(shì)之一。如果能夠理解MySQL Server與存儲(chǔ)引擎之間是怎樣通過(guò)API交互的,將大大有利于理解MySQL的核心基礎(chǔ)架構(gòu)。本文將首先介紹MySQL的整體邏輯架構(gòu),然后分析MySQL的存儲(chǔ)引擎API并介紹如何編寫自己的MySQL存儲(chǔ)引擎。

MySQL邏輯架構(gòu)

MySQL作為一個(gè)大型的網(wǎng)絡(luò)程序、數(shù)據(jù)管理系統(tǒng),架構(gòu)非常復(fù)雜。下圖大致畫出了其邏輯架構(gòu)。

86333662-061b-11ef-a297-92fbcf53809c.png

Connectors

MySQL首先是一個(gè)網(wǎng)絡(luò)程序,其在TCP之上定義了自己的應(yīng)用層協(xié)議。所以要使用MySQL,我們可以編寫代碼,跟MySQL Server建立TCP連接,之后按照其定義好的協(xié)議進(jìn)行交互。當(dāng)然這樣比較麻煩,比較方便的辦法是調(diào)用SDK,比如Native C API、JDBC、PHP等各語(yǔ)言MySQL Connector,或者通過(guò)ODBC。但通過(guò)SDK來(lái)訪問(wèn)MySQL,本質(zhì)上還是在TCP連接上通過(guò)MySQL協(xié)議跟MySQL進(jìn)行交互。

Connection Management

每一個(gè)基于TCP的網(wǎng)絡(luò)服務(wù)都需要管理客戶端鏈接,MySQL也不例外。MySQL會(huì)為每一個(gè)連接綁定一個(gè)線程,之后這個(gè)連接上的所有查詢都在這個(gè)線程中執(zhí)行。為了避免頻繁創(chuàng)建和銷毀線程帶來(lái)開銷,MySQL通常會(huì)緩存線程或者使用線程池,從而避免頻繁的創(chuàng)建和銷毀線程。

客戶端連接到MySQL后,在使用MySQL的功能之前,需要進(jìn)行認(rèn)證,認(rèn)證基于用戶名、主機(jī)名、密碼。如果用了SSL或者TLS的方式進(jìn)行連接,還會(huì)進(jìn)行證書認(rèn)證。

SQL Interface

MySQL支持DML(數(shù)據(jù)操作語(yǔ)言)、DDL(數(shù)據(jù)定義語(yǔ)言)、存儲(chǔ)過(guò)程、視圖、觸發(fā)器、自定義函數(shù)等多種SQL語(yǔ)言接口。

Parser

MySQL會(huì)解析SQL查詢,并為其創(chuàng)建語(yǔ)法樹,并根據(jù)數(shù)據(jù)字典豐富查詢語(yǔ)法樹,會(huì)驗(yàn)證該客戶端是否具有執(zhí)行該查詢的權(quán)限。創(chuàng)建好語(yǔ)法樹后,MySQL還會(huì)對(duì)SQl查詢進(jìn)行語(yǔ)法上的優(yōu)化,進(jìn)行查詢重寫。

Optimizer

語(yǔ)法解析和查詢重寫之后,MySQL會(huì)根據(jù)語(yǔ)法樹和數(shù)據(jù)的統(tǒng)計(jì)信息對(duì)SQL進(jìn)行優(yōu)化,包括決定表的讀取順序、選擇合適的索引等,最終生成SQL的具體執(zhí)行步驟。這些具體的執(zhí)行步驟里真正的數(shù)據(jù)操作都是通過(guò)預(yù)先定義好的存儲(chǔ)引擎API來(lái)進(jìn)行的,與具體的存儲(chǔ)引擎實(shí)現(xiàn)無(wú)關(guān)。

Caches & Buffers

MySQL內(nèi)部維持著一些Cache和Buffer,比如Query Cache用來(lái)緩存一條Select語(yǔ)句的執(zhí)行結(jié)果,如果能夠在其中找到對(duì)應(yīng)的查詢結(jié)果,那么就不必再進(jìn)行查詢解析、優(yōu)化和執(zhí)行的整個(gè)過(guò)程了。

Pluggable Storage Engine

存儲(chǔ)引擎的具體實(shí)現(xiàn),這些存儲(chǔ)引擎都實(shí)現(xiàn)了MySQl定義好的存儲(chǔ)引擎API的部分或者全部。MySQL可以動(dòng)態(tài)安裝或移除存儲(chǔ)引擎,可以有多種存儲(chǔ)引擎同時(shí)存在,可以為每個(gè)Table設(shè)置不同的存儲(chǔ)引擎。存儲(chǔ)引擎負(fù)責(zé)在文件系統(tǒng)之上,管理表的數(shù)據(jù)、索引的實(shí)際內(nèi)容,同時(shí)也會(huì)管理運(yùn)行時(shí)的Cache、Buffer、事務(wù)、Log等數(shù)據(jù)和功能。

MySQL 5.7.11默認(rèn)支持的存儲(chǔ)引擎如下:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

File System

所有的數(shù)據(jù),數(shù)據(jù)庫(kù)、表的定義,表的每一行的內(nèi)容,索引,都是存在文件系統(tǒng)上,以文件的方式存在的。當(dāng)然有些存儲(chǔ)引擎比如InnoDB,也支持不使用文件系統(tǒng)直接管理裸設(shè)備,但現(xiàn)代文件系統(tǒng)的實(shí)現(xiàn)使得這樣做沒(méi)有必要了。

在文件系統(tǒng)之下,可以使用本地磁盤,可以使用DAS、NAS、SAN等各種存儲(chǔ)系統(tǒng)。

存儲(chǔ)引擎API

MySQL定義了一系列存儲(chǔ)引擎API,以支持插件式存儲(chǔ)引擎架構(gòu)。API以Handler類的虛函數(shù)的方式存在,可在代碼庫(kù)下的./sql/handler.h中查看詳細(xì)信息,可在handler類的注釋中看到描述:

/**
  The handler class is the interface for dynamically loadable
  storage engines. Do not add ifdefs and take care when adding or
  changing virtual functions to avoid vtable confusion

  Functions in this class accept and return table columns data. Two data
  representation formats are used:
  1. TableRecordFormat - Used to pass [partial] table records to/from
     storage engine

  2. KeyTupleFormat - used to pass index search tuples (aka "keys") to
     storage engine. See opt_range.cc for description of this format.

  TableRecordFormat
  =================
  [Warning: this description is work in progress and may be incomplete]
  The table record is stored in a fixed-size buffer:

    record: null_bytes, column1_data, column2_data, ...

  //篇幅原因,略去部分內(nèi)容。

*/
class handler :public Sql_alloc
{
    //篇幅原因,不列出具體代碼。讀者可直接在源碼文件./sql/handler.h中找到具體內(nèi)容。
}

下面我將分類描述部分存儲(chǔ)引擎API。

創(chuàng)建、打開和關(guān)閉表

通過(guò)函數(shù)create來(lái)創(chuàng)建一個(gè)table:

/**
  *name:要?jiǎng)?chuàng)建的表的名字
  *from:一個(gè)TABLE類型的結(jié)構(gòu),要?jiǎng)?chuàng)建的表的定義,跟MySQL Server已經(jīng)創(chuàng)建好的tablename.frm文件內(nèi)容是匹配的
  *info:一個(gè)HA_CREATE_INFO類型的結(jié)構(gòu),包含了客戶端輸入的CREATE TABLE語(yǔ)句的信息
*/

int create(const char *name, TABLE *form, HA_CREATE_INFO *info);

通過(guò)函數(shù)open來(lái)打開一個(gè)table:

/**
  mode包含以下兩種
  O_RDONLY  -  Open read only
  O_RDWR    -  Open read/write
*/
int open(const char *name, int mode, int test_if_locked);

通過(guò)函數(shù)close來(lái)關(guān)閉一個(gè)table:

int close(void);

對(duì)表加鎖

當(dāng)客戶端調(diào)用LOCK TABLE時(shí),通過(guò)external_lock函數(shù)加鎖:

int ha_example::external_lock(THD *thd, int lock_type)

全表掃描

//初始化全表掃描
virtual int rnd_init (bool scan);

//從表中讀取下一行
virtual int rnd_next (byte* buf);

通過(guò)索引訪問(wèn)table內(nèi)容

//使用索引前調(diào)用該方法
int ha_foo::index_init(uint keynr, bool sorted) 


//使用索引后調(diào)用該方法
int ha_foo::index_end(uint keynr, bool sorted)

//讀取索引第一條內(nèi)容
int ha_index_first(uchar * buf);

//讀取索引下一條內(nèi)容
int ha_index_next(uchar * buf);

//讀取索引前一條內(nèi)容
int ha_index_prev(uchar * buf);

//讀取索引最后一條內(nèi)容
int ha_index_last(uchar * buf);

//給定一個(gè)key基于索引讀取內(nèi)容
int index_read(uchar * buf, const uchar * key, uint key_len,
                         enum ha_rkey_function find_flag)

事務(wù)處理

//開始一個(gè)事務(wù)
int my_handler::start_stmt(THD *thd, thr_lock_type lock_type)

//回滾一個(gè)事務(wù)
int (*rollback)(THD *thd, bool all); 

//提交一個(gè)事務(wù)
int (*commit)(THD *thd, bool all);

如何編寫自己的存儲(chǔ)引擎

在MySQL的官方文檔上,有對(duì)于編寫自己的存儲(chǔ)引擎的指導(dǎo)文檔,鏈接如下。

作為編寫自己存儲(chǔ)引擎的開始,你可以查看MySQL源碼庫(kù)中的一個(gè)EXAMPLE存儲(chǔ)引擎,它實(shí)現(xiàn)了必須要實(shí)現(xiàn)的存儲(chǔ)引擎API,可以通過(guò)復(fù)制它們作為編寫我們自己存儲(chǔ)引擎的開始:

sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.h > ha_foo.h
sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.cc > ha_foo.cc

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1400

    瀏覽量

    80645
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    850

    瀏覽量

    27728

原文標(biāo)題:MySQL的多存儲(chǔ)引擎架構(gòu)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    整體架構(gòu)

    整體思路整體思路整體思路
    發(fā)表于 06-27 15:10

    0基礎(chǔ)學(xué)Mysql:mysql入門視頻教程!

    的性能調(diào)優(yōu)技術(shù)掌握基于MySQL架構(gòu)設(shè)計(jì)方案課程目錄:第1節(jié) MySQL課程介紹和MySQL的基礎(chǔ)概念(1)第2節(jié) MySQL基礎(chǔ)概念之存
    發(fā)表于 07-08 10:51

    FPGA芯片整體架構(gòu)

    FPGA芯片整體架構(gòu)如下所示,整個(gè)芯片是以BANK進(jìn)...
    發(fā)表于 07-29 07:00

    初探Android系統(tǒng)整體架構(gòu)

    Android系統(tǒng)龐大且錯(cuò)綜復(fù)雜,今天小編將帶領(lǐng)大家初探Android系統(tǒng)整體架構(gòu),一窺其全貌。引言本文作為Android系統(tǒng)架構(gòu)的開篇,起到提綱挈領(lǐng)的作用,從系統(tǒng)整體
    發(fā)表于 08-20 06:32

    XILINX FPGA 芯片整體架構(gòu)是如何構(gòu)成的

    XILINX FPGA 芯片整體架構(gòu)是如何構(gòu)成的?XILINX FPGA 芯片有哪些資源?
    發(fā)表于 10-29 06:26

    匿名飛控源碼整體邏輯順序是怎樣的

    匿名飛控源碼整體邏輯順序是怎樣的?
    發(fā)表于 01-20 07:50

    RRC邏輯架構(gòu)(UE側(cè))

    RRC邏輯架構(gòu)(UE側(cè))
    發(fā)表于 09-18 15:24 ?1180次閱讀

    RRC邏輯架構(gòu)(UTRAN側(cè))

    RRC邏輯架構(gòu)(UTRAN側(cè))
    發(fā)表于 09-18 15:25 ?1080次閱讀

    MySQL基礎(chǔ)架構(gòu)自動(dòng)化測(cè)試分析

    schema 遷移等幾個(gè)方面說(shuō)明了為何會(huì)相信MySQL自動(dòng)化。以下為譯文。 對(duì)于GitHub來(lái)說(shuō),MySQL的基礎(chǔ)架構(gòu)是非常重要的組件。MySQL給GitHub.com、GitHub
    發(fā)表于 09-28 16:47 ?0次下載
    <b class='flag-5'>MySQL</b>基礎(chǔ)<b class='flag-5'>架構(gòu)</b>自動(dòng)化測(cè)試分析

    詳解MySQL的查詢優(yōu)化 MySQL邏輯架構(gòu)分析

    說(shuō)起MySQL的查詢優(yōu)化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理創(chuàng)建索引、為字段選擇合適的數(shù)據(jù)類型..... 你是否真的理解這些優(yōu)化技巧?是否理解其背后
    的頭像 發(fā)表于 05-28 16:43 ?4555次閱讀
    詳解<b class='flag-5'>MySQL</b>的查詢優(yōu)化 <b class='flag-5'>MySQL</b><b class='flag-5'>邏輯</b><b class='flag-5'>架構(gòu)</b>分析

    MySQL數(shù)據(jù)庫(kù):理解MySQL的性能優(yōu)化、優(yōu)化查詢

    最近一直在為大家更新MySQL相關(guān)學(xué)習(xí)內(nèi)容,可能有朋友不懂MySQL的重要性。在程序,語(yǔ)言,架構(gòu)更新?lián)Q代頻繁的今天,MySQL 恐怕是大家使用最多的存儲(chǔ)數(shù)據(jù)庫(kù)了。由于
    的頭像 發(fā)表于 07-02 17:18 ?3332次閱讀
    <b class='flag-5'>MySQL</b>數(shù)據(jù)庫(kù):理解<b class='flag-5'>MySQL</b>的性能優(yōu)化、優(yōu)化查詢

    干貨:20個(gè)MySQL開源數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)原則

    干貨:20個(gè)MySQL開源數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)原則
    的頭像 發(fā)表于 08-28 10:57 ?3680次閱讀

    MySQL的底層原理和技術(shù)學(xué)習(xí)

    面試時(shí),被面試官吊打的現(xiàn)象成了家常便飯。 不僅僅是面試,如果你想從一名底層程序員上升為高級(jí)工程師、架構(gòu)師等,MySQL的底層原理和技術(shù)是你必須要掌握的。 今天一起來(lái)學(xué)習(xí)MySQL的體系架構(gòu)
    的頭像 發(fā)表于 04-06 16:51 ?3218次閱讀

    SQLite和MySQL區(qū)別

    Web應(yīng)用、電商平臺(tái)等。 2.架構(gòu)差異 MySQL采用C/S架構(gòu),是典型的客戶端/服務(wù)器模式。MySQL服務(wù)器是一
    的頭像 發(fā)表于 08-28 17:09 ?6324次閱讀

    適用于MySQL的dbForge架構(gòu)比較

    dbForge Schema Compare for MySQL 是一種工具,用于輕松有效地比較和部署 MySQL 數(shù)據(jù)庫(kù)結(jié)構(gòu)和腳本文件夾差異。該工具提供了 MySQL 數(shù)據(jù)庫(kù)架構(gòu)中所
    的頭像 發(fā)表于 10-28 09:41 ?544次閱讀
    適用于<b class='flag-5'>MySQL</b>的dbForge<b class='flag-5'>架構(gòu)</b>比較