精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL的整體邏輯架構

馬哥Linux運維 ? 來源:cnblogs ? 2024-04-30 11:14 ? 次閱讀

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

MySQL邏輯架構

MySQL作為一個大型的網絡程序、數據管理系統,架構非常復雜。下圖大致畫出了其邏輯架構。

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

Connectors

MySQL首先是一個網絡程序,其在TCP之上定義了自己的應用層協議。所以要使用MySQL,我們可以編寫代碼,跟MySQL Server建立TCP連接,之后按照其定義好的協議進行交互。當然這樣比較麻煩,比較方便的辦法是調用SDK,比如Native C API、JDBC、PHP等各語言MySQL Connector,或者通過ODBC。但通過SDK來訪問MySQL,本質上還是在TCP連接上通過MySQL協議跟MySQL進行交互。

Connection Management

每一個基于TCP的網絡服務都需要管理客戶端鏈接,MySQL也不例外。MySQL會為每一個連接綁定一個線程,之后這個連接上的所有查詢都在這個線程中執行。為了避免頻繁創建和銷毀線程帶來開銷,MySQL通常會緩存線程或者使用線程池,從而避免頻繁的創建和銷毀線程。

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

SQL Interface

MySQL支持DML(數據操作語言)、DDL(數據定義語言)、存儲過程、視圖、觸發器、自定義函數等多種SQL語言接口

Parser

MySQL會解析SQL查詢,并為其創建語法樹,并根據數據字典豐富查詢語法樹,會驗證該客戶端是否具有執行該查詢的權限。創建好語法樹后,MySQL還會對SQl查詢進行語法上的優化,進行查詢重寫。

Optimizer

語法解析和查詢重寫之后,MySQL會根據語法樹和數據的統計信息對SQL進行優化,包括決定表的讀取順序、選擇合適的索引等,最終生成SQL的具體執行步驟。這些具體的執行步驟里真正的數據操作都是通過預先定義好的存儲引擎API來進行的,與具體的存儲引擎實現無關。

Caches & Buffers

MySQL內部維持著一些Cache和Buffer,比如Query Cache用來緩存一條Select語句的執行結果,如果能夠在其中找到對應的查詢結果,那么就不必再進行查詢解析、優化和執行的整個過程了。

Pluggable Storage Engine

存儲引擎的具體實現,這些存儲引擎都實現了MySQl定義好的存儲引擎API的部分或者全部。MySQL可以動態安裝或移除存儲引擎,可以有多種存儲引擎同時存在,可以為每個Table設置不同的存儲引擎。存儲引擎負責在文件系統之上,管理表的數據、索引的實際內容,同時也會管理運行時的Cache、Buffer、事務、Log等數據和功能。

MySQL 5.7.11默認支持的存儲引擎如下:

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

所有的數據,數據庫、表的定義,表的每一行的內容,索引,都是存在文件系統上,以文件的方式存在的。當然有些存儲引擎比如InnoDB,也支持不使用文件系統直接管理裸設備,但現代文件系統的實現使得這樣做沒有必要了。

在文件系統之下,可以使用本地磁盤,可以使用DAS、NAS、SAN等各種存儲系統。

存儲引擎API

MySQL定義了一系列存儲引擎API,以支持插件式存儲引擎架構。API以Handler類的虛函數的方式存在,可在代碼庫下的./sql/handler.h中查看詳細信息,可在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, ...

  //篇幅原因,略去部分內容。

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

下面我將分類描述部分存儲引擎API。

創建、打開和關閉表

通過函數create來創建一個table:

/**
  *name:要創建的表的名字
  *from:一個TABLE類型的結構,要創建的表的定義,跟MySQL Server已經創建好的tablename.frm文件內容是匹配的
  *info:一個HA_CREATE_INFO類型的結構,包含了客戶端輸入的CREATE TABLE語句的信息
*/

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

通過函數open來打開一個table:

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

通過函數close來關閉一個table:

int close(void);

對表加鎖

當客戶端調用LOCK TABLE時,通過external_lock函數加鎖:

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

全表掃描

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

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

通過索引訪問table內容

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


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

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

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

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

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

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

事務處理

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

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

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

如何編寫自己的存儲引擎

在MySQL的官方文檔上,有對于編寫自己的存儲引擎的指導文檔,鏈接如下。

作為編寫自己存儲引擎的開始,你可以查看MySQL源碼庫中的一個EXAMPLE存儲引擎,它實現了必須要實現的存儲引擎API,可以通過復制它們作為編寫我們自己存儲引擎的開始:

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

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1349

    瀏覽量

    78985
  • MySQL
    +關注

    關注

    1

    文章

    801

    瀏覽量

    26441

原文標題:MySQL的多存儲引擎架構

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    整體架構

    整體思路整體思路整體思路
    發表于 06-27 15:10

    0基礎學Mysql:mysql入門視頻教程!

    的性能調優技術掌握基于MySQL架構設計方案課程目錄:第1節 MySQL課程介紹和MySQL的基礎概念(1)第2節 MySQL基礎概念之存
    發表于 07-08 10:51

    FPGA芯片整體架構

    FPGA芯片整體架構如下所示,整個芯片是以BANK進...
    發表于 07-29 07:00

    初探Android系統整體架構

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

    XILINX FPGA 芯片整體架構是如何構成的

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

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

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

    RRC邏輯架構(UE側)

    RRC邏輯架構(UE側)
    發表于 09-18 15:24 ?1102次閱讀

    RRC邏輯架構(UTRAN側)

    RRC邏輯架構(UTRAN側)
    發表于 09-18 15:25 ?945次閱讀

    MySQL基礎架構自動化測試分析

    schema 遷移等幾個方面說明了為何會相信MySQL自動化。以下為譯文。 對于GitHub來說,MySQL的基礎架構是非常重要的組件。MySQL給GitHub.com、GitHub
    發表于 09-28 16:47 ?0次下載
    <b class='flag-5'>MySQL</b>基礎<b class='flag-5'>架構</b>自動化測試分析

    詳解MySQL的查詢優化 MySQL邏輯架構分析

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

    MySQL數據庫:理解MySQL的性能優化、優化查詢

    最近一直在為大家更新MySQL相關學習內容,可能有朋友不懂MySQL的重要性。在程序,語言,架構更新換代頻繁的今天,MySQL 恐怕是大家使用最多的存儲數據庫了。由于
    的頭像 發表于 07-02 17:18 ?3068次閱讀
    <b class='flag-5'>MySQL</b>數據庫:理解<b class='flag-5'>MySQL</b>的性能優化、優化查詢

    干貨:20個MySQL開源數據庫架構設計原則

    干貨:20個MySQL開源數據庫架構設計原則
    的頭像 發表于 08-28 10:57 ?3358次閱讀

    MySQL的底層原理和技術學習

    面試時,被面試官吊打的現象成了家常便飯。 不僅僅是面試,如果你想從一名底層程序員上升為高級工程師、架構師等,MySQL的底層原理和技術是你必須要掌握的。 今天一起來學習MySQL的體系架構
    的頭像 發表于 04-06 16:51 ?3034次閱讀

    SQLite和MySQL區別

    Web應用、電商平臺等。 2.架構差異 MySQL采用C/S架構,是典型的客戶端/服務器模式。MySQL服務器是一
    的頭像 發表于 08-28 17:09 ?4671次閱讀

    適用于MySQL的dbForge架構比較

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