MySQL基本組成
SQL執(zhí)行流程
Server 層主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器,包含了MySQL主要的很多核心功能,以及所有的內(nèi)置函數(shù)、存儲(chǔ)過(guò)程、觸發(fā)器、視圖等,其實(shí)就是所有跨存儲(chǔ)引擎的功能都是在這一層實(shí)現(xiàn)的 存儲(chǔ)引擎層,主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取,是以插件的形式存在的 ,支持如 InnoDB 、MyISAM 、Memory 等多個(gè)存儲(chǔ)引擎,現(xiàn)在默認(rèn)為 InnoDB
查詢緩存當(dāng)一個(gè)SQL執(zhí)行時(shí)首先會(huì)進(jìn)入查詢緩存 查看之前是否執(zhí)行過(guò)該語(yǔ)句,如果執(zhí)行過(guò)則會(huì)以key-value的形式保存在緩存中,key是查詢語(yǔ)句,value是查詢結(jié)果 如果緩存命中則直接返回結(jié)果,如果查詢語(yǔ)句不在緩存中繼續(xù)后面的流程 大多數(shù)情況下我們不推薦使用查詢緩存,因?yàn)榫彺媸Х浅nl繁,只要一個(gè)更新,那么這個(gè)表上所有的緩存都會(huì)失效,吐過(guò)數(shù)據(jù)的更新比較多,那么緩沖命中的效率很低,不斷的在失效 在MySQL中提供了參數(shù) query_cache_type 參數(shù)來(lái)設(shè)置,默認(rèn)是 DEMAND ,表示對(duì)默認(rèn)的SQL都不使用查詢緩存,如果要對(duì)特的語(yǔ)句進(jìn)行緩存查詢,則可以使用 SQL_CACHE 來(lái)顯示的指定,如 select SQL_CACHE * from T where ID=1; 在MySQL8.0 開(kāi)始,查詢緩存整個(gè)功能模塊已經(jīng)刪除掉不再擁有
分析器分析器主要包含詞法分析與語(yǔ)法分析 詞法分析主要分析一條SQL中各個(gè)字符串代表什么,比如 select 標(biāo)記出來(lái),這就是一個(gè)查詢,在具體的表名,查詢 的字段等等全部分析出來(lái) 語(yǔ)法分析主要是分析SQL語(yǔ)句是否符合MySQL的規(guī)范,如果我們SQL寫(xiě)的有問(wèn)題,那么經(jīng)常看到的一個(gè)異常就是 You have an error in your SQL syntax 的提示
優(yōu)化器對(duì)我們的SQL進(jìn)行優(yōu)化,得到更高的執(zhí)行計(jì)劃 如有多個(gè)索引時(shí)確定要用那個(gè)索引 當(dāng)有多變聯(lián)查join 時(shí),查詢表的順序 對(duì)查詢條件和語(yǔ)句的優(yōu)化
執(zhí)行器Buffer Pool[server] innodb_buffer_pool_size = 2147483648
數(shù)據(jù)頁(yè)MySQL中對(duì)數(shù)據(jù)進(jìn)行抽象,按照數(shù)據(jù)頁(yè)的形式來(lái)存放到文件,當(dāng)查詢時(shí),首先定位到要查詢數(shù)據(jù)所在的數(shù)據(jù)頁(yè),之后將整個(gè)數(shù)據(jù)頁(yè)加載到Buffer Pool 中, 數(shù)據(jù)頁(yè)默認(rèn)的大小是 16KB , 也就是一頁(yè)數(shù)據(jù)包含16KB 的數(shù)據(jù) 在BufferPool 中的數(shù)據(jù)頁(yè)一般我們叫緩存頁(yè),默認(rèn)情況下緩存頁(yè)與磁盤(pán)上的數(shù)據(jù)頁(yè)大小是對(duì)應(yīng)的 對(duì)于每個(gè)緩存頁(yè)都有一個(gè)描述信息 描述信息包括:數(shù)據(jù)頁(yè)的所屬表空間,數(shù)據(jù)頁(yè)的標(biāo)號(hào),這個(gè)緩存頁(yè)在Buffer Pool 中的內(nèi)存地址以及其他一些信息 在 Buffer Pool 中,所有的描述信息都在最前面,然后各個(gè)緩存頁(yè)放在后面

表空間平時(shí)我們創(chuàng)建張表時(shí)都會(huì)在磁盤(pán)上對(duì)應(yīng)著一個(gè)表名.ibd , 這樣的磁盤(pán)數(shù)據(jù)文件,這就是表空間的概念和物理體現(xiàn) 對(duì)于一些系統(tǒng)表空間可能存在著對(duì)應(yīng)多個(gè)磁盤(pán)文件,我們自己創(chuàng)建的表對(duì)應(yīng)的表空間一般都是對(duì)應(yīng)一個(gè) 表名.ibd 的數(shù)據(jù)文件
數(shù)據(jù)區(qū)在表空間中有太多的數(shù)據(jù)頁(yè)不好管理,這是引入了數(shù)據(jù)區(qū)的概念,英文:extent 一個(gè)數(shù)據(jù)區(qū)中有連續(xù)的64 個(gè)數(shù)據(jù)頁(yè),每個(gè)數(shù)據(jù)頁(yè)16kb , 所以每個(gè)數(shù)據(jù)區(qū)大小是1MB 同時(shí)265 個(gè)數(shù)據(jù)區(qū)被劃分為一組 在表空間中第一組數(shù)據(jù)區(qū)的第一個(gè)數(shù)據(jù)區(qū)的前三個(gè)數(shù)據(jù)頁(yè)是固定的,存放一些特殊的描述性的信息 FSP_HDR 數(shù)據(jù)頁(yè): 存放一些表空間和這一組數(shù)據(jù)區(qū)的屬性
IBUF——BITMAP 數(shù)據(jù)頁(yè):存放這組數(shù)據(jù)頁(yè)所有的 insert buffer 的一些信息
INODE 數(shù)據(jù)頁(yè):存放一些特殊信息
表空間中其他各組數(shù)據(jù)區(qū)的第一個(gè)數(shù)據(jù)區(qū)的頭兩個(gè)數(shù)據(jù)頁(yè)都是存放特殊信息的
本文由AnonyStar 發(fā)布,可轉(zhuǎn)載但需聲明原文出處。
|