gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一文搞懂MySQL索引下推

本篇文章給大家帶來了關于mysql的相關知識,其中主要介紹了關于索引下推的相關內容,索引條件下推也叫索引下推,英文全稱Index Condition Pushdown,簡稱ICP,用于優化數據查詢,下面一起來看一下,希望對大家有幫助。

一文搞懂MySQL索引下推

程序員必備接口測試調試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調試、文檔、自動化測試工具
后端、前端、測試,同時在線協作,內容實時同步

推薦學習:mysql視頻教程

SELECT 語句執行過程

MySQL 數據庫由 Server 層和 Engine 層組成:

  • Server 層:SQL 分析器、SQL 優化器、SQL 執行器,用于負責 SQL 語句的具體執行過程。
  • Engine 層: 負責存儲具體的數據,如最常使用的 InnoDB 存儲引擎,還有用于在內存中存儲臨時結果集的 TempTable 引擎。

一文搞懂MySQL索引下推

  • 通過客戶端/服務器通信協議與 MySQL 建立連接。

  • 查詢緩存:

    • 如果開啟了 Query Cache 且在查詢緩存過程中查詢到完全相同的 SQL 語句,則將查詢結果直接返回給客戶端;
    • 如果沒有開啟 Query Cache 或者沒有查詢到完全相同的 SQL 語句則會由解析器進行語法語義解析,并生成解析樹。
  • 分析器生成新的解析樹。

  • 查詢優化器生成執行計劃。

  • 查詢執行引擎執行 SQL 語句,此時查詢執行引擎會根據 SQL 語句中表的存儲引擎類型,以及對應的 API 接口與底層存儲引擎緩存或者物理文件的交互情況,得到查詢結果,由 MySQL Server 過濾后將查詢結果緩存并返回給客戶端。

    若開啟了 Query Cache,這時也會將 SQL 語句和結果完整地保存到 Query Cache 中,以后若有相同的 SQL 語句執行則直接返回結果。

TipsMySQL 8.0 已去掉 query cache(查詢緩存模塊)。

因為查詢緩存的命中率會非常低。 查詢緩存的失效非常頻繁:只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。

什么是索引下推?

索引下推(Index Condition Pushdown): 簡稱 ICP,通過把索引過濾條件下推到存儲引擎,來減少 MySQL 存儲引擎訪問基表的次數 和 MySQL 服務層訪問存儲引擎的次數。

索引下推 VS 覆蓋索引: 其實都是 減少回表的次數,只不過方式不同

  • 覆蓋索引: 當索引中包含所需要的字段(SELECT XXX),則不再回表去查詢字段。

  • 索引下推: 對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表的行數。

要了解 ICP 是如何工作的,先從一個查詢 SQL 開始:

舉個栗子:查詢名字 la 開頭、年齡為 18 的記錄

SELECT * FROM user WHERE name LIKE 'la%' AND age = 18;
登錄后復制

有這些記錄:

一文搞懂MySQL索引下推

不開啟 ICP 時索引掃描是如何進行的:

  • 通過索引元組,定位讀取對應數據行。(實際上:就是回表)
  • WHERE 中字段做判斷,過濾掉不滿足條件的行。

一文搞懂MySQL索引下推

使用 ICP,索引掃描如下進行:

  • 獲取索引元組。
  • WHERE 中字段做判斷,在索引列中進行過濾。
  • 對滿足條件的索引,進行回表查詢整行。
  • WHERE 中字段做判斷,過濾掉不滿足條件的行。

一文搞懂MySQL索引下推

動手實驗:

實驗:使用 MySQL 版本 8.0.16

-- 表創建 CREATE TABLE IF NOT EXISTS `user` ( `id` VARCHAR(64) NOT NULL COMMENT '主鍵 id', `name` VARCHAR(50) NOT NULL COMMENT '名字', `age` TINYINT NOT NULL COMMENT '年齡', `address` VARCHAR(100) NOT NULL COMMENT '地址', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '用戶表';  -- 創建索引 CREATE INDEX idx_name_age ON user (name, age);  -- 新增數據 INSERT INTO user (id, name, age, address) VALUES (1, 'tt', 14, 'linhai'); INSERT INTO user (id, name, age, address) VALUES (2, 'lala', 18, 'linhai'); INSERT INTO user (id, name, age, address) VALUES (3, 'laxi', 30, 'linhai'); INSERT INTO user (id, name, age, address) VALUES (4, 'lawa', 40, 'linhai');  -- 查詢語句 SELECT * FROM user WHERE name LIKE 'la%' AND age = 18;
登錄后復制

新增數據如下:

一文搞懂MySQL索引下推

  • 關閉 ICP,再調用 EXPLAIN 查看語句:

-- 將 ICP 關閉 SET optimizer_switch = 'index_condition_pushdown=off'; -- 查看確認 show variables like 'optimizer_switch';  -- 用 EXPLAIN 查看 EXPLAIN SELECT * FROM user WHERE name LIKE 'la%' AND age = 18;
登錄后復制

一文搞懂MySQL索引下推

  • 開啟 ICP,再調用 EXPLAIN 查看語句:

-- 將 ICP 打開 SET optimizer_switch = 'index_condition_pushdown=on'; -- 查看確認 show variables like 'optimizer_switch';  -- 用 EXPLAIN 查看 EXPLAIN SELECT * FROM user WHERE name LIKE 'la%' AND age = 18;
登錄后復制

一文搞懂MySQL索引下推

由上實驗可知,區別是否開啟 ICP Exira 字段中的 Using index condition

一文搞懂MySQL索引下推

更進一步,來看下 ICP 帶來的性能提升:

通過訪問數據文件的次數

-- 1. 清空 status 狀態 flush status; -- 2. 查詢 SELECT * FROM user WHERE name LIKE 'la%' AND age = 18; -- 3. 查看 handler 狀態 show status like '%handler%';
登錄后復制

對比開啟 ICP 和 關閉 ICP 關注 Handler_read_next 的值

-- 開啟 ICP flush status; SELECT * FROM user WHERE name LIKE 'la%' AND age = 18; show status like '%handler%'; +----------------------------|-------+ | Variable_name              | Value | +----------------------------|-------+ | Handler_commit             | 1     | | Handler_delete             | 0     | | Handler_discover           | 0     | | Handler_external_lock      | 2     | | Handler_mrr_init           | 0     | | Handler_prepare            | 0     | | Handler_read_first         | 0     | | Handler_read_key           | 1     |   | Handler_read_last          | 0     | | Handler_read_next          | 1     |  <---重點 | Handler_read_prev          | 0     | | Handler_read_rnd           | 0     | | Handler_read_rnd_next      | 0     | | Handler_rollback           | 0     | | Handler_savepoint          | 0     | | Handler_savepoint_rollback | 0     | | Handler_update             | 0     | | Handler_write              | 0     | +----------------------------|-------+ 18 rows in set (0.00 sec)   -- 關閉 ICP flush status; SELECT * FROM user WHERE name LIKE 'la%' AND age = 18; show status like '%handler%'; +----------------------------|-------+ | Variable_name              | Value | +----------------------------|-------+ | Handler_commit             | 1     | | Handler_delete             | 0     | | Handler_discover           | 0     | | Handler_external_lock      | 2     | | Handler_mrr_init           | 0     | | Handler_prepare            | 0     | | Handler_read_first         | 0     | | Handler_read_key           | 1     | | Handler_read_last          | 0     | | Handler_read_next          | 3     |  <---重點 | Handler_read_prev          | 0     | | Handler_read_rnd           | 0     | | Handler_read_rnd_next      | 0     | | Handler_rollback           | 0     | | Handler_savepoint          | 0     | | Handler_savepoint_rollback | 0     | | Handler_update             | 0     | | Handler_write              | 0     | +----------------------------|-------+ 18 rows in set (0.00 sec)
登錄后復制

由上實驗可知:

  • 開啟 ICPHandler_read_next 等于 1,回表查 1 次。
  • 關閉 ICPHandler_read_next 等于 3,回表查 3 次。

這實驗跟上面的栗子就對應上了。

索引下推限制

根據官網可知,索引下推 受以下條件限制:

  • 當需要訪問整個表行時,ICP 用于 rangerefeq_refref_or_null

  • ICP可以用于 InnoDBMyISAM 表,包括分區表 InnoDBMyISAM 表。

  • 對于 InnoDB 表,ICP 僅用于二級索引。ICP 的目標是減少全行讀取次數,從而減少 I/O 操作。對于 InnoDB 聚集索引,完整的記錄已經讀入 InnoDB 緩沖區。在這種情況下使用 ICP 不會減少 I/O

  • 在虛擬生成列上創建的二級索引不支持 ICPInnoDB 支持虛擬生成列的二級索引。

  • 引用子查詢的條件不能下推。

  • 引用存儲功能的條件不能被按下。存儲引擎不能調用存儲的函數。

  • 觸發條件不能下推。

  • 不能將條件下推到包含對系統變量的引用的派生表。(MySQL 8.0.30 及更高版本)。

小結下:

  • ICP 僅適用于 二級索引
  • ICP 目標是 減少回表查詢
  • ICP 對聯合索引的部分列模糊查詢非常有效。

拓展:虛擬列

CREATE TABLE UserLogin ( userId BIGINT, loginInfo JSON, cellphone VARCHAR(255) AS (loginInfo->>"$.cellphone"), PRIMARY KEY(userId), UNIQUE KEY idx_cellphone(cellphone) );
登錄后復制

cellphone :就是一個虛擬列,它是由后面的函數表達式計算而成,本身這個列不占用任何的存儲空間,而索引 idx_cellphone 實質是一個函數索引

好處: 在寫 SQL 時可以直接使用這個虛擬列,而不用寫冗長的函數。

舉個栗子: 查詢手機號

-- 不用虛擬列 SELECT * FROM UserLogin WHERE loginInfo->>"$.cellphone" = '13988888888'  -- 使用虛擬列 SELECT * FROM UserLogin WHERE cellphone = '13988888888'
登錄后復制

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
99精品视频免费版的特色功能| 免费成人在线视频网站| 天天爱天天做天天操| 超碰在线人人爱| 亚洲男人天堂色| 一区二区三区 日韩| 日本激情视频在线播放| 免费无码国产v片在线观看| 免费av手机在线观看| 亚洲国产成人精品无码区99| 激情六月天婷婷| 欧美日韩激情四射| 免费av网址在线| 中文字幕在线综合| 簧片在线免费看| 天堂在线中文在线| 黑人巨大国产9丨视频| 一本—道久久a久久精品蜜桃| 日本a在线天堂| r级无码视频在线观看| 国产一二三区在线播放| 亚洲一二三区av| 波多野结衣xxxx| 99热一区二区三区| 日韩黄色片在线| 成年人免费在线播放| 国产精品亚洲二区在线观看| 成人免费看片'免费看| 国产3p露脸普通话对白| 99免费视频观看| 亚洲免费成人在线视频| 懂色av一区二区三区四区五区| 97av中文字幕| 免费观看成人网| 免费看av软件| 日韩精品视频久久| 亚洲国产日韩欧美在线观看| 国产精品久久久影院| 欧美精品 - 色网| 国产又大又黄又粗又爽| 青娱乐国产精品视频| 91午夜在线观看| 日本不卡一区二区在线观看| 亚洲精品无码久久久久久| 中文字幕第21页| 日日摸日日碰夜夜爽无码| 中文字幕亚洲欧洲| 久草精品在线播放| 国产美女永久无遮挡| 99re精彩视频| 日韩在线xxx| 日韩精品在线观看av| www.日本久久| 草草草在线视频| 一女被多男玩喷潮视频| 2019日韩中文字幕mv| 热久久久久久久久| www.色偷偷.com| 青青草原av在线播放| 欧美三级在线观看视频| avove在线观看| 三年中国中文在线观看免费播放| 亚洲中文字幕久久精品无码喷水 | 九一精品久久久| 日本久久精品一区二区| 欧美日韩性生活片| 国产夫妻自拍一区| www.亚洲成人网| 天堂中文av在线| 韩国日本美国免费毛片| 奇米精品一区二区三区| 天堂av.com| 999精品网站| 黄色aaa级片| 国产精品免费成人| 国产97在线 | 亚洲| 蜜臀av色欲a片无码精品一区| 日韩欧美理论片| 狠狠热免费视频| 日本xxxxxxx免费视频| 久久婷婷五月综合色国产香蕉| jizz18女人| 成年网站在线播放| 污网站免费在线| 亚洲欧美视频二区| 在线观看岛国av| 天天爽天天爽夜夜爽| 久草综合在线观看| 91av在线免费播放| 国产xxxx振车| 色七七在线观看| 黄大色黄女片18第一次| 可以看污的网站| 日本女人高潮视频| 一本—道久久a久久精品蜜桃| 国产5g成人5g天天爽| 久久出品必属精品| 天天干天天操天天玩| av动漫在线播放| 激情综合在线观看| 中文字幕无码不卡免费视频| 91小视频网站| 亚欧美一区二区三区| 国产专区在线视频| av之家在线观看| 天天干天天爽天天射| 91丝袜超薄交口足| 欧美视频在线第一页| 鲁一鲁一鲁一鲁一澡| 亚洲天堂av线| 六月婷婷激情综合| 9久久婷婷国产综合精品性色 | www.xxx亚洲| 白嫩少妇丰满一区二区| 国产视频在线观看网站| 日本激情视频在线| 国产玉足脚交久久欧美| 国产一区二区网| www.激情网| 日本男人操女人| 青草网在线观看| 亚洲xxx在线观看| 国产视频九色蝌蚪| 黄色一级片av| 国产精品自拍片| 天堂а√在线中文在线| 高清一区在线观看| 国产精品自拍片| 欧美久久久久久久久久久久久久| 欧在线一二三四区| 欧美视频免费播放| 国产福利视频在线播放| 日韩精品免费一区| 日本精品一区在线| 一道本视频在线观看| 黄页网站大全在线观看| 9色视频在线观看| 久章草在线视频| 国产成人亚洲精品无码h在线| 欧美大黑帍在线播放| 欧美成人手机在线视频| 三级视频中文字幕| 草草草在线视频| 毛葺葺老太做受视频| 久久精品国产sm调教网站演员| 四虎1515hh.com| 国产成年人在线观看| 激情在线观看视频| 极品粉嫩美女露脸啪啪| 911av视频| 91精产国品一二三产区别沈先生| 一级一片免费播放| 国产欧美自拍视频| aaa免费在线观看| 性久久久久久久久久久久久久| 日韩一级理论片| 婷婷中文字幕在线观看| 久久精品午夜福利| 国产三级精品三级在线| 久久久精品高清| youjizz.com亚洲| 国产免费xxx| 五月丁香综合缴情六月小说| 欧美亚洲日本一区二区三区| 免费特级黄色片| 欧美大尺度做爰床戏| 久久成年人网站| 97在线国产视频| 久草青青在线观看| 在线看的黄色网址| 成人手机在线播放| 日本阿v视频在线观看| 欧美视频在线免费播放| 欧美视频第一区| 中文字幕第三区| 男人天堂新网址| 亚洲少妇久久久| 欧美一级中文字幕| 午夜免费福利在线| wwwwww欧美| 少妇激情一区二区三区| 免费看黄色a级片| 国产精品av免费观看| 亚洲污视频在线观看| 精品国偷自产一区二区三区| 国产日韩一区二区在线观看| 国产奶头好大揉着好爽视频| 人妻熟女一二三区夜夜爱| 午夜久久久精品| 日韩在线第三页| av在线观看地址| 婷婷激情小说网| 中文字幕欧美人妻精品一区| 老司机午夜网站| 国产999免费视频| 国产一区视频免费观看| 久久久性生活视频| 91九色国产ts另类人妖| 自拍偷拍21p| 成人毛片一区二区|