<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在研究mysql二級索引的時候,發現Mysql回表這個操作,往下研究了一下
字面意思,找到索引,回到表中找資料
解釋一下就是:
先通過索引掃描出資料所在的行,再通過行主鍵ID 取出資料。
舉個例子說明:
SELECT * FROM INNODB_USER WHERE AGE = 18 AND USER_NAME LIKE '模糊查%';
假如age
和user_name
兩個欄位是個聯合索引,我們通過age
=18這個索引找到了二級索引樹對應頁所在的資料,但是由於user_name
是模糊查詢,導致了這個欄位的索引失效,我們得到了二級索引的這一頁中age
=18的很多個資料(主鍵id),我們通過這些主鍵ID回到主鍵索引樹裡再查表裡的資料,這個操作就是回表。
另外回表的產生也是需要一定條件的,如果一次索引查詢就能獲得所有的select 記錄(也就是聯合索引已經包含了你查的欄位)就不需要回表,如果select 所需獲得列中有其他的非索引列,就會發生回表動作。即基於非主鍵索引的查詢需要多掃描一棵索引樹。
另外上面所說的不需要回表,其實還有另一個名詞
就是我們需要查詢的資料都在二級索引樹中,直接返回這種情況就叫做覆蓋索引。
上面提到的聯合索引、二級索引樹、主鍵索引樹這些名詞,如果同學們還沒有啥概念,請看我寫的這一篇文章,詳細介紹了MYSQL的索引
連結: MySQL索引詳解及演進過程及面試題延伸
索引下推(index condition pushdown )簡稱ICP,在Mysql5.6以後的版本上推出,用於優化回表查詢;
在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級索引)進行查詢時,儲存引擎通過索引檢索到資料,然後返回給MySQL伺服器,伺服器然後判斷資料是否符合條件 ;
在使用ICP的情況下,如果存在某些被索引的列的判斷條件時,MySQL伺服器將這一部分判斷條件傳遞給儲存引擎,
然後由儲存引擎通過判斷索引是否符合MySQL伺服器傳遞的條件,只有當索引符合條件時才會將資料檢索出來返回給MySQL伺服器 ;
索引條件下推優化可以減少儲存引擎查詢基礎表的次數,也可以減少MySQL伺服器從儲存引擎接收資料的次數。
舉個栗子:
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 '年紀', `address` varchar(255) DEFAULT NULL COMMENT '地址', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 預設否', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', PRIMARY KEY (`id`), KEY `idx_name_age` (`name`,`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='使用者資訊表';
-- 初始化資料 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, '中國');
用上面的語句建一個測試用的表
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
關閉索引下推:
索引下推是mysql 5.6優化查詢回表的功能,在5.6之前都不支援索引下推,筆者用的8.0,則需要先關閉索引下推: set optimizer_switch='index_condition_pushdown=off';
執行sql;
EXPLAIN SELECT * from t_user where name like '李%' and age = 22;
分析一下以上sql執行的過程:
以上過程會掃描4條記錄,回表4次。
extra = Using where:表示優化器需要通過索引回表查詢資料。
set optimizer_switch='index_condition_pushdown=on';
執行sql:
EXPLAIN SELECT * from t_user where name like '李%' and age = 22;
開啟索引下推優化後再分析一下以上sql執行的過程:
以上過程會掃描4行資料,回表次數是2次。
extra = Using index condition 表示索引下推。
總結:
到此這篇關於MySQL 回表,覆蓋索引,索引下推的文章就介紹到這了,更多相關MySQL 回表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45