亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入了解MySQL中索引優(yōu)化器的工作原理

 更新時(shí)間:2022年11月09日 08:53:22   作者:小明Java問道之路  
本文將解讀MySQL數(shù)據(jù)庫查詢優(yōu)化器(CBO)的工作原理。文中簡(jiǎn)單介紹了MySQL?Server的組成,MySQL優(yōu)化器選擇索引額原理以及SQL成本分析,需要的可以參考一下

本文導(dǎo)讀

本文將解讀MySQL數(shù)據(jù)庫查詢優(yōu)化器(CBO)的工作原理。簡(jiǎn)單介紹了MySQL Server的組成,MySQL優(yōu)化器選擇索引額原理以及SQL成本分析,最后通過 select 查詢總結(jié)整個(gè)查詢過程。

一、MySQL 優(yōu)化器是如何選擇索引的

下面我們來看這張表,SUB_ODR_ID字段創(chuàng)建了相關(guān)的 2 個(gè)索引,根據(jù)我們前面所學(xué)我們建立一個(gè)PRIMARY KEY (ID)自增主鍵索引,(LOG_ID, SUB_ODR_ID)設(shè)置為聯(lián)合索引、唯一索引,兩個(gè)時(shí)間CREATE_TIME、UPDATE_TIME分別設(shè)置兩個(gè)索引。

CREATE TABLE `***`  (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `LOG_ID` varchar(32) NOT NULL COMMENT '交易流水號(hào)',
  `ODR_ID` varchar(32) NOT NULL COMMENT '父單號(hào)',
  `SUB_ODR_ID` varchar(32) NOT NULL COMMENT '子單號(hào)',
  `CREATE_TIME` datetime(0) NOT NULL COMMENT '創(chuàng)建時(shí)間',
  `CREATE_BY` varchar(32) NOT NULL COMMENT ' 創(chuàng)建人',
  `UPDATE_TIME` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時(shí)間',
  `UPDATE_BY` varchar(32) NOT NULL COMMENT '更新人',
  PRIMARY KEY (`ID`) USING BTREE,
  UNIQUE INDEX `UNQ_LOG_SUBODR_ID`(`LOG_ID`, `SUB_ODR_ID`) USING BTREE,
  INDEX `IDX_ODR_ID`(`ODR_ID`) USING BTREE,
  INDEX `IDX_SUB_ID`(`SUB_ODR_ID`) USING BTREE,
  INDEX `IDX_CREATE_TIME`(`CREATE_TIME`) USING BTREE,
  INDEX `IDX_UPDATE_TIME`(`UPDATE_TIME`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 SET = utf8 COLLATE = utf8_general_ci COMMENT = '分?jǐn)倶I(yè)務(wù)明細(xì)表' ROW_FORMAT = Dynamic;

在查詢字段 SUB_ODR_ID 中,理論上可以使用三個(gè)相關(guān)的索引:UNQ_LOG_SUBODR_ID、IDX_SUB_ID,MySQL優(yōu)化器如何從這三個(gè)索引中進(jìn)行選擇?

在關(guān)系數(shù)據(jù)庫中,B+樹只是用于存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)。

如何使用它取決于數(shù)據(jù)庫的優(yōu)化器。優(yōu)化器確定特定索引的選擇,即執(zhí)行計(jì)劃。優(yōu)化器的選擇基于成本,成本越低,首選指數(shù)越高。

1、MySQL數(shù)據(jù)庫組成

MySQL數(shù)據(jù)庫由Server(服務(wù)器)層和Engine(引擎)層組成。

Serve層有SQL分析器、SQL優(yōu)化器和SQL執(zhí)行器,負(fù)責(zé)SQL語句的具體執(zhí)行過程。

Engine層負(fù)責(zé)存儲(chǔ)特定數(shù)據(jù),例如最常用的InnoDB存儲(chǔ)引擎,以及用于在內(nèi)存中存儲(chǔ)臨時(shí)結(jié)果集的TempTable引擎。

SQL優(yōu)化器將分析所有可能的執(zhí)行計(jì)劃,并選擇成本最低的執(zhí)行。這個(gè)優(yōu)化器被稱為CBO(基于成本的優(yōu)化器)。

2、MySQL數(shù)據(jù)庫成本計(jì)算

在 MySQL中,一條 SQL 的計(jì)算成本計(jì)算,很好理解,就是訪問數(shù)據(jù)庫(數(shù)據(jù)庫頁、磁盤)+處理數(shù)據(jù)。

CPU成本,表示計(jì)算成本,例如索引鍵值的比較、記錄值的比較和結(jié)果集的排序。這些操作都在服務(wù)器層完成

IO成本,表示引擎級(jí)IO的成本,MySQL 8.0可以通過區(qū)分表的數(shù)據(jù)是否在內(nèi)存中來分別計(jì)算讀取內(nèi)存IO和磁盤IO的成本。

Cost  = Server Cost + Engine Cost  = CPU Cost + IO Cost

MySQL優(yōu)化器認(rèn)為,如果一段SQL需要?jiǎng)?chuàng)建一個(gè)基于磁盤的臨時(shí)表,那么此時(shí)的成本是最大的,是基于內(nèi)存的臨時(shí)表的20倍。比較索引鍵值和記錄的成本很低,但如果要比較的記錄很多,成本就會(huì)非常大。

MySQL 優(yōu)化器認(rèn)為,從磁盤讀取的開銷是內(nèi)存開銷的 4 倍(成本不是一成不變的會(huì)根據(jù)硬件變化)。

二、MySQL查詢成本

查看各成本的值,MySQL優(yōu)化器的工作原理,我們執(zhí)行下面這行SQL語句,分析執(zhí)行過程,MySQL 索引選擇是基于 SQL 執(zhí)行成本

EXPLAIN FORMAT=json 
select * from test.fork_business_detail f where f.sub_odr_id = ''

read_cost表示從InnoDB存儲(chǔ)引擎讀取的成本;

eval_cost表示服務(wù)器層的CPU成本;

prefix_cost表示SQL的總成本;

data_read_per_join 表示讀取記錄中的字節(jié)總數(shù)。

{
	"query_block": {
		"cost_info": {
			"query_cost": "1.20"
		},
		"table": {
			"access_type": "ref",
			"possible_keys": [
				"IDX_SUB_ID"
			],
			"key": "IDX_SUB_ID",
			"used_key_parts": [
				"SUB_ODR_ID"
			],
			"key_length": "98",
			"ref": [
				"const"
			],
			"cost_info": {
				"read_cost": "1.00",
				"eval_cost": "0.20",
				"prefix_cost": "1.20",
				"data_read_per_join": "1K"
			},
			"used_columns": [
				"ID",
				"LOG_ID",
				"ODR_ID",
				"SUB_ODR_ID",
				"CREATE_TIME",
				"CREATE_BY",
				"UPDATE_TIME",
				"UPDATE_BY"
			]
		}
	}
}

三、SELECT 執(zhí)行過程

如何提高M(jìn)ySQL的查詢性能?首先,您需要了解查詢優(yōu)化器進(jìn)行SQL處理的整個(gè)過程。SELECT SQL 的執(zhí)行過程為例,如下圖所示: 

客戶端向服務(wù)器發(fā)送SELECT查詢;服務(wù)器首先檢查查詢緩存。如果緩存被命中,存儲(chǔ)在緩存中的結(jié)果將立即返回。否則,進(jìn)入下一階段;

服務(wù)器執(zhí)行SQL解析、預(yù)處理,查詢優(yōu)化器生成相應(yīng)的執(zhí)行計(jì)劃;MySQL根據(jù)優(yōu)化器生成的執(zhí)行計(jì)劃調(diào)用存儲(chǔ)引擎的API執(zhí)行查詢;結(jié)果將返回到客戶端,并同時(shí)放入查詢緩存。

總結(jié)

本文解讀了MySQL數(shù)據(jù)庫查詢優(yōu)化器(CBO)的工作原理。簡(jiǎn)單介紹了MySQL Server的組成,MySQL優(yōu)化器選擇索引額原理以及SQL成本分析,最后通過 select 查詢總結(jié)整個(gè)查詢過程。

到此這篇關(guān)于深入了解MySQL中索引優(yōu)化器的工作原理的文章就介紹到這了,更多相關(guān)MySQL索引優(yōu)化器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 實(shí)現(xiàn)lastInfdexOf的功能案例

    MySQL 實(shí)現(xiàn)lastInfdexOf的功能案例

    這篇文章主要介紹了MySQL 實(shí)現(xiàn)lastInfdexOf的功能案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • mysql用戶管理操作實(shí)例分析

    mysql用戶管理操作實(shí)例分析

    這篇文章主要介紹了mysql用戶管理操作,結(jié)合實(shí)例形式分析了mysql用戶管理查看、創(chuàng)建、修改、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04
  • MySQL?存儲(chǔ)引擎InnoDB最佳實(shí)踐

    MySQL?存儲(chǔ)引擎InnoDB最佳實(shí)踐

    InnoDB是一款兼顧高可靠性和高性能的通用存儲(chǔ)引擎,在MySQL8.0中默認(rèn)的存儲(chǔ)引擎是InnoDB,這篇文章主要介紹了MySQL存儲(chǔ)引擎InnoDB詳解,需要的朋友可以參考下
    2025-05-05
  • Mysql 多表聯(lián)合更新的項(xiàng)目實(shí)踐

    Mysql 多表聯(lián)合更新的項(xiàng)目實(shí)踐

    本文介紹MySQL多表更新方法,對(duì)于多表的UPDATE操作需要慎重,建議在更新前,先使用 SELECT 語句查詢驗(yàn)證更新的數(shù)據(jù)與自己期望的是否一致,下面就來詳細(xì)的介紹一下
    2025-06-06
  • MySQL如何使用視圖插入修改刪除數(shù)據(jù)

    MySQL如何使用視圖插入修改刪除數(shù)據(jù)

    視圖除了進(jìn)行查詢記錄外,也可以利用視圖進(jìn)行插入、更新、刪除記錄的操作,減少對(duì)基表中信息的直接操作,提高了數(shù)據(jù)的安全性,下面這篇文章主要給大家介紹了關(guān)于MySQL如何使用視圖插入修改刪除數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Ubuntu 18.04下mysql 8.0 安裝配置方法圖文教程

    Ubuntu 18.04下mysql 8.0 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu 18.04下mysql 8.0 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 聽說mysql中的join很慢?是你用的姿勢(shì)不對(duì)吧

    聽說mysql中的join很慢?是你用的姿勢(shì)不對(duì)吧

    這篇文章主要介紹了聽說mysql中的join很慢?是你用的姿勢(shì)不對(duì)吧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL中WITH?AS語句的使用方法舉例

    MySQL中WITH?AS語句的使用方法舉例

    在MySQL中WITH AS語法用于創(chuàng)建一個(gè)臨時(shí)的命名查詢(也稱為子查詢),這些子查詢可以在后續(xù)的查詢中引用,從而簡(jiǎn)化查詢語句的編寫,這篇文章主要給大家介紹了關(guān)于MySQL中WITH?AS語句的使用方法,需要的朋友可以參考下
    2024-06-06
  • 深入理解?MySQL?索引底層原理

    深入理解?MySQL?索引底層原理

    這篇文章主要介紹了深入理解?MySQL?索引底層原理的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò)問題

    MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò)問題

    本文主要介紹了MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論