Server 層主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器,包含了MySQL主要的很多核心功能,以及所有的內(nèi)置函數(shù)、存儲過程、觸發(fā)器、視圖等,其實就是所有跨存儲引擎的功能都是在這一層實現(xiàn)的
存儲引擎層,主要負責數(shù)據(jù)的存儲和讀取,是以插件的形式存在的 ,支持如 InnoDB
、MyISAM
、Memory
等多個存儲引擎,現(xiàn)在默認為 InnoDB
當一個SQL執(zhí)行時首先會進入查詢緩存
查看之前是否執(zhí)行過該語句,如果執(zhí)行過則會以key-value的形式保存在緩存中,key是查詢語句,value是查詢結(jié)果
如果緩存命中則直接返回結(jié)果,如果查詢語句不在緩存中繼續(xù)后面的流程
大多數(shù)情況下我們不推薦使用查詢緩存,因為緩存失效非常頻繁,只要一個更新,那么這個表上所有的緩存都會失效,吐過數(shù)據(jù)的更新比較多,那么緩沖命中的效率很低,不斷的在失效
在MySQL中提供了參數(shù) query_cache_type
參數(shù)來設置,默認是 DEMAND
,表示對默認的SQL都不使用查詢緩存,如果要對特的語句進行緩存查詢,則可以使用 SQL_CACHE
來顯示的指定,如 select SQL_CACHE * from T where ID=1;
在MySQL8.0 開始,查詢緩存整個功能模塊已經(jīng)刪除掉不再擁有
分析器主要包含詞法分析與語法分析
詞法分析主要分析一條SQL中各個字符串代表什么,比如 select
標記出來,這就是一個查詢,在具體的表名,查詢 的字段等等全部分析出來
語法分析主要是分析SQL語句是否符合MySQL的規(guī)范,如果我們SQL寫的有問題,那么經(jīng)??吹降囊粋€異常就是 You have an error in your SQL syntax
的提示
對我們的SQL進行優(yōu)化,得到更高的執(zhí)行計劃
如有多個索引時確定要用那個索引
當有多變聯(lián)查join
時,查詢表的順序
對查詢條件和語句的優(yōu)化
首先校驗是否有對這張表的訪問權(quán)限,如果沒有權(quán)限則會報錯
如果有,則根據(jù)引擎接口打開表進行數(shù)據(jù)的查詢篩選
默認大小128MB
, 偏小
對于16核32G機器,可以分配2G內(nèi)存,配置文件:my.ini
配置:
[server]
innodb_buffer_pool_size = 2147483648
MySQL中對數(shù)據(jù)進行抽象,按照數(shù)據(jù)頁的形式來存放到文件,當查詢時,首先定位到要查詢數(shù)據(jù)所在的數(shù)據(jù)頁,之后將整個數(shù)據(jù)頁加載到Buffer Pool
中,
數(shù)據(jù)頁默認的大小是 16KB
, 也就是一頁數(shù)據(jù)包含16KB
的數(shù)據(jù)
在BufferPool
中的數(shù)據(jù)頁一般我們叫緩存頁,默認情況下緩存頁與磁盤上的數(shù)據(jù)頁大小是對應的
對于每個緩存頁都有一個描述信息
描述信息包括:數(shù)據(jù)頁的所屬表空間,數(shù)據(jù)頁的標號,這個緩存頁在Buffer Pool
中的內(nèi)存地址以及其他一些信息
在 Buffer Pool
中,所有的描述信息都在最前面,然后各個緩存頁放在后面
描述數(shù)據(jù)大小相當于緩存頁大小的5%
左右,也就是大概800
字節(jié),所以當我們設置buffer pool
的大小為128MB
,但是實際上 Buffer Pool
的真實大小會超出一些,可能有有130MB
左右,這多出來的就是每個緩存頁的描述信息
平時我們創(chuàng)建張表時都會在磁盤上對應著一個表名.ibd
, 這樣的磁盤數(shù)據(jù)文件,這就是表空間的概念和物理體現(xiàn)
對于一些系統(tǒng)表空間可能存在著對應多個磁盤文件,我們自己創(chuàng)建的表對應的表空間一般都是對應一個 表名.ibd
的數(shù)據(jù)文件
在表空間中有太多的數(shù)據(jù)頁不好管理,這是引入了數(shù)據(jù)區(qū)的概念,英文:extent
一個數(shù)據(jù)區(qū)中有連續(xù)的64
個數(shù)據(jù)頁,每個數(shù)據(jù)頁16kb
, 所以每個數(shù)據(jù)區(qū)大小是1MB
同時265
個數(shù)據(jù)區(qū)被劃分為一組
在表空間中第一組數(shù)據(jù)區(qū)的第一個數(shù)據(jù)區(qū)的前三個數(shù)據(jù)頁是固定的,存放一些特殊的描述性的信息
FSP_HDR
數(shù)據(jù)頁: 存放一些表空間和這一組數(shù)據(jù)區(qū)的屬性
IBUF——BITMAP
數(shù)據(jù)頁:存放這組數(shù)據(jù)頁所有的 insert buffer
的一些信息
INODE
數(shù)據(jù)頁:存放一些特殊信息
表空間中其他各組數(shù)據(jù)區(qū)的第一個數(shù)據(jù)區(qū)的頭兩個數(shù)據(jù)頁都是存放特殊信息的
本文由AnonyStar 發(fā)布,可轉(zhuǎn)載但需聲明原文出處。