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

MySQL 回表,覆蓋索引,索引下推

 更新時(shí)間:2022年07月11日 08:48:54   作者:向著百萬年薪努力的小  
這篇文章主要介紹了MySQL 回表,覆蓋索引,索引下推,就是我們需要查詢的數(shù)據(jù)都在二級(jí)索引樹中,直接返回這種情況就叫做覆蓋索引

回表

在研究mysql二級(jí)索引的時(shí)候,發(fā)現(xiàn)Mysql回表這個(gè)操作,往下研究了一下

字面意思,找到索引,回到表中找數(shù)據(jù)

解釋一下就是:

先通過索引掃描出數(shù)據(jù)所在的行,再通過行主鍵ID 取出數(shù)據(jù)。

舉個(gè)例子說明:

SELECT * FROM INNODB_USER
WHERE AGE = 18 AND USER_NAME LIKE '模糊查%';

假如ageuser_name兩個(gè)字段是個(gè)聯(lián)合索引,我們通過age=18這個(gè)索引找到了二級(jí)索引樹對(duì)應(yīng)頁所在的數(shù)據(jù),但是由于user_name是模糊查詢,導(dǎo)致了這個(gè)字段的索引失效,我們得到了二級(jí)索引的這一頁中age=18的很多個(gè)數(shù)據(jù)(主鍵id),我們通過這些主鍵ID回到主鍵索引樹里再查表里的數(shù)據(jù),這個(gè)操作就是回表。

另外回表的產(chǎn)生也是需要一定條件的,如果一次索引查詢就能獲得所有的select 記錄(也就是聯(lián)合索引已經(jīng)包含了你查的字段)就不需要回表,如果select 所需獲得列中有其他的非索引列,就會(huì)發(fā)生回表動(dòng)作。即基于非主鍵索引的查詢需要多掃描一棵索引樹。

另外上面所說的不需要回表,其實(shí)還有另一個(gè)名詞

覆蓋索引

就是我們需要查詢的數(shù)據(jù)都在二級(jí)索引樹中,直接返回這種情況就叫做覆蓋索引。

上面提到的聯(lián)合索引、二級(jí)索引樹、主鍵索引樹這些名詞,如果同學(xué)們還沒有啥概念,請(qǐng)看我寫的這一篇文章,詳細(xì)介紹了MYSQL的索引
鏈接: MySQL索引詳解及演進(jìn)過程及面試題延伸

索引下推

索引下推(index condition pushdown )簡(jiǎn)稱ICP,在Mysql5.6以后的版本上推出,用于優(yōu)化回表查詢;

在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級(jí)索引)進(jìn)行查詢時(shí),存儲(chǔ)引擎通過索引檢索到數(shù)據(jù),然后返回給MySQL服務(wù)器,服務(wù)器然后判斷數(shù)據(jù)是否符合條件 ;

在使用ICP的情況下,如果存在某些被索引的列的判斷條件時(shí),MySQL服務(wù)器將這一部分判斷條件傳遞給存儲(chǔ)引擎,
然后由存儲(chǔ)引擎通過判斷索引是否符合MySQL服務(wù)器傳遞的條件,只有當(dāng)索引符合條件時(shí)才會(huì)將數(shù)據(jù)檢索出來返回給MySQL服務(wù)器 ;

索引條件下推優(yōu)化可以減少存儲(chǔ)引擎查詢基礎(chǔ)表的次數(shù),也可以減少M(fèi)ySQL服務(wù)器從存儲(chǔ)引擎接收數(shù)據(jù)的次數(shù)。

舉個(gè)栗子:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(64) NOT NULL COMMENT '用戶名 ',
  `age` int(8) NOT NULL COMMENT '年紀(jì)',
	`address` varchar(255) DEFAULT NULL COMMENT '地址',
  `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 默認(rèn)否',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`),
  KEY `idx_name_age` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用戶信息表';
-- 初始化數(shù)據(jù) 
INSERT INTO `t_user`(`name`, `age`, `address`) VALUES ('李四', 22, '中國');
INSERT INTO `t_user`(`name`, `age`, `address`) VALUES ('李五', 22, '中國');
INSERT INTO `t_user`(`name`, `age`, `address`) VALUES ('李六', 23, '中國');
INSERT INTO `t_user`(`name`, `age`, `address`) VALUES ('張三', 24, '中國');
INSERT INTO `t_user`(`name`, `age`, `address`) VALUES ('李期', 24, '中國');

用上面的語句建一個(gè)測(cè)試用的表

無索引下推: 查看索引下推的狀態(tài)

show VARIABLES like '%optimizer_switch%';
-------------------------------------------------------
optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on

關(guān)閉索引下推:

索引下推是mysql 5.6優(yōu)化查詢回表的功能,在5.6之前都不支持索引下推,筆者用的8.0,則需要先關(guān)閉索引下推:
set optimizer_switch='index_condition_pushdown=off';

執(zhí)行sql;

EXPLAIN SELECT * from t_user where name like '李%' and age = 22;

在這里插入圖片描述

分析一下以上sql執(zhí)行的過程:

  • 1. idx_name_age`組合索引 遵循最左匹配遇到非等值判斷時(shí)匹配停止,name的范圍查詢則會(huì)使age這個(gè)條件就不會(huì)走索引;
  • 2. 會(huì)先在name索引上順序找到 符合條件的name和id數(shù)據(jù);
  • 3. 然后通過id在聚簇索引上回表找到對(duì)應(yīng)的age數(shù)據(jù),將結(jié)果存放在臨時(shí)表中;
  • 4. 最后在臨時(shí)表中通過age條件來篩選數(shù)據(jù)。

以上過程會(huì)掃描4條記錄,回表4次。
extra = Using where:表示優(yōu)化器需要通過索引回表查詢數(shù)據(jù)。

有索引下推: 開啟索引下推

set optimizer_switch='index_condition_pushdown=on';

執(zhí)行sql:

EXPLAIN SELECT * from t_user where name like '李%' and age = 22;

在這里插入圖片描述

開啟索引下推優(yōu)化后再分析一下以上sql執(zhí)行的過程:

  • 1. 由于開啟了索引下推會(huì)在idx_name_age索引上同時(shí)檢索滿足name和age的條件的數(shù)據(jù)的id;
  • 2. 再用id到聚簇索引上查詢完整的數(shù)據(jù)。

以上過程會(huì)掃描4行數(shù)據(jù),回表次數(shù)是2次。

extra = Using index condition 表示索引下推。

總結(jié):

  • 索引下推功能是mysql 5.6推出優(yōu)化回表的操作,只支持向上兼容,低版本是不支持的;
  • 索引下推優(yōu)化的只是回表次數(shù),掃描行數(shù)還是一樣的。

到此這篇關(guān)于MySQL 回表,覆蓋索引,索引下推的文章就介紹到這了,更多相關(guān)MySQL 回表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL數(shù)據(jù)庫優(yōu)化技術(shù)之配置技巧總結(jié)

    MySQL數(shù)據(jù)庫優(yōu)化技術(shù)之配置技巧總結(jié)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫優(yōu)化技術(shù)之配置技巧,較為詳細(xì)的總結(jié)分析了MySQL進(jìn)行硬件級(jí)軟件優(yōu)化的相關(guān)方法與注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • MySQL主從復(fù)制原理詳情

    MySQL主從復(fù)制原理詳情

    這篇文章主要介紹了MySQL主從復(fù)制原理詳情,MySQL?主從復(fù)制是指數(shù)據(jù)可以從一個(gè)MySQL數(shù)據(jù)庫服務(wù)器主節(jié)點(diǎn)復(fù)制到一個(gè)或多個(gè)從節(jié)點(diǎn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹。感興趣的小伙伴可以參考一下
    2022-06-06
  • mysql?子查詢的概述和分類及單行子查詢功能實(shí)現(xiàn)

    mysql?子查詢的概述和分類及單行子查詢功能實(shí)現(xiàn)

    本文詳細(xì)介紹了MySQL的子查詢概念和應(yīng)用,解釋了子查詢是在主查詢中嵌套另一個(gè)查詢,包括外查詢和內(nèi)查詢,并從多個(gè)角度進(jìn)行分類,文章還深入探討了子查詢的編寫技巧和使用場(chǎng)景,對(duì)于學(xué)習(xí)和應(yīng)用MySQL的人來說,這是一篇非常有價(jià)值的指南
    2024-10-10
  • MySQL筆記之修改數(shù)據(jù)的解決方法

    MySQL筆記之修改數(shù)據(jù)的解決方法

    本篇文章介紹了,在mysql中修改數(shù)據(jù)的解決方法。需要的朋友參考下
    2013-05-05
  • mysql 超大數(shù)據(jù)/表管理技巧

    mysql 超大數(shù)據(jù)/表管理技巧

    在實(shí)際應(yīng)用中經(jīng)過存儲(chǔ)、優(yōu)化可以做到在超過9千萬數(shù)據(jù)中的查詢響應(yīng)速度控制在1到20毫秒??瓷先ナ莻€(gè)不錯(cuò)的成績(jī),不過優(yōu)化這條路沒有終點(diǎn),當(dāng)我們的系統(tǒng)有超過幾百人、上千人同時(shí)使用時(shí),仍然會(huì)顯的力不從心
    2013-03-03
  • MySQL中update語法的使用記錄

    MySQL中update語法的使用記錄

    在MySQL中,UPDATE?語句用于修改已存在的表中的記錄,下面通過示例介紹MySQL中update語法的使用記錄,感興趣的朋友一起看看吧
    2024-07-07
  • window下mysql 8.0.15 安裝配置方法圖文教程

    window下mysql 8.0.15 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了window下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • docker 部署mysql詳細(xì)過程(docker部署常見應(yīng)用)

    docker 部署mysql詳細(xì)過程(docker部署常見應(yīng)用)

    這篇文章主要介紹了docker 部署mysql之docker部署常見應(yīng)用,本文以docker部署mysql5.7.26為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Mysql主從GTID與binlog的區(qū)別及說明

    Mysql主從GTID與binlog的區(qū)別及說明

    MySQL GTID(全局事務(wù)標(biāo)識(shí)符)與binlog(二進(jìn)制日志)是搭建主從復(fù)制的兩種機(jī)制,GTID為每個(gè)事務(wù)分配唯一標(biāo)識(shí),確保復(fù)制無數(shù)據(jù)沖突或丟失,便于復(fù)制配置和管理;binlog記錄所有數(shù)據(jù)庫更改,用于數(shù)據(jù)恢復(fù)和復(fù)制,GTID基于事務(wù)標(biāo)識(shí)
    2024-10-10
  • mysql實(shí)現(xiàn)sequence功能的代碼

    mysql實(shí)現(xiàn)sequence功能的代碼

    今天小編就為大家分享一篇關(guān)于mysql實(shí)現(xiàn)sequence功能的代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評(píng)論