mysql創建存儲時覆蓋_總結到位的MySQL 的覆蓋索引與回表

兩大類索引

使用的存儲引擎:MySQL5.7 InnoDB

聚簇索引

* 如果表設置了主鍵,則主鍵就是聚簇索引

* 如果表沒有主鍵,則會默認第一個NOT NULL,且唯一(UNIQUE)的列作為聚簇索引

* 以上都沒有,則會默認創建一個隱藏的row_id作為聚簇索引

由此可見,使用聚簇索引查詢會很快,因為可以直接定位到行記錄。

普通索引

InnoDB的普通索引葉子節點存儲的是主鍵(聚簇索引)的值,而MyISAM的普通索引存儲的是記錄指針。

示例

建表

mysql> create table user(

-> id int(10) auto_increment,

-> name varchar(30),

-> age tinyint(4),

-> primary key (id),

-> index idx_age (age)

-> )engine=innodb charset=utf8mb4;

id 字段是聚簇索引,age 字段是普通索引(二級索引)

填充數據

insert into user(name,age) values('張三',30);

insert into user(name,age) values('李四',20);

insert into user(name,age) values('王五',40);

insert into user(name,age) values('劉八',10);

mysql> select * from user;

+----+--------+------+

| id | name | age |

+----+--------+------+

| 1 | 張三 | 30 |

| 2 | 李四 | 20 |

| 3 | 王五 | 40 |

| 4 | 劉八 | 10 |

+----+--------+------+

索引存儲結構

id 是主鍵,所以是聚簇索引,其葉子節點存儲的是對應行記錄的數據

聚簇索引(ClusteredIndex)

age 是普通索引(二級索引),非聚簇索引,其葉子節點存儲的是聚簇索引的的值

普通索引(secondaryIndex)

如:select * from user where id = 1;

聚簇索引查找過程

如果查詢條件為普通索引(非聚簇索引),需要掃描兩次B+樹,第一次掃描通過普通索引定位到聚簇索引的值,然后第二次掃描通過聚簇索引的值定位到要查找的行記錄數據。

1. 先通過普通索引 age=30 定位到主鍵值 id=1

2. 再通過聚集索引 id=1 定位到行記錄數據

普通索引查找過程第一步

普通索引查找過程第二步

回表查詢

先通過普通索引的值定位聚簇索引值,再通過聚簇索引的值定位行記錄數據,需要掃描兩次索引B+樹,它的性能較掃一遍索引樹更低。

索引覆蓋

例如:select id,age from user where age = 10;

如何實現覆蓋索引

1、如實現:select id,age from user where age = 10;

explain分析:因為age是普通索引,使用到了age索引,通過一次掃描B+樹即可查詢到相應的結果,這樣就實現了覆蓋索引

explain分析:age是普通索引,但name列不在索引樹上,所以通過age索引在查詢到id和age的值后,需要進行回表再查詢name的值。此時的Extra列的NULL表示進行了回表查詢

為了實現索引覆蓋,需要建組合索引idx_age_name(age,name)

drop index idx_age on user;

create index idx_age_name on user(`age`,`name`);

explain分析:此時字段age和name是組合索引idx_age_name,查詢的字段id、age、name的值剛剛都在索引樹上,只需掃描一次組合索引B+樹即可,這就是實現了索引覆蓋,此時的Extra字段為Using index表示使用了索引覆蓋。

哪些場景適合使用索引覆蓋來優化SQL

全表count查詢優化

mysql> create table user(

-> id int(10) auto_increment,

-> name varchar(30),

-> age tinyint(4),

-> primary key (id),

-> )engine=innodb charset=utf8mb4;

例如:select count(age) from user;

使用索引覆蓋優化:創建age字段索引

create index idx_age on user(age);

列查詢回表優化

前文在描述索引覆蓋使用的例子就是

例如:select id,age,name from user where age = 10;

使用索引覆蓋:建組合索引idx_age_name(age,name)即可

分頁查詢

因為name字段不是索引,所以在分頁查詢需要進行回表查詢,此時Extra為Using filesort文件排序,查詢性能低下。

使用索引覆蓋:建組合索引idx_age_name(age,name)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385908.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java小程序開發平臺,隔壁都饞哭了

01 阿里面試題之MySQL 之前的阿里面試題都有做總結,具體面試題內容整理成了文檔,本文是針對MySQL系列的,所以下面只展示了自己第一次面試阿里時被吊打問到的一些MySQL難題 請解釋關系型數據庫概念及主要特點?請說出關系型數據庫…

java小程序查看器,成功拿到offer

架構筑基 大家都知道,性能一直是讓程序員比較頭疼的問題。當系統架構變得復雜而龐大之后,性能方面就會下降,如果想成為一名優秀的架構師,性能優化就是你必須思考的問題。 所以性能優化專題從JVM底層原理到內存優化再到各個中間件…

java小程序設計一個國旗點擊國旗唱國歌,看這篇足矣了!

工作的前兩年 如果你不能拼爹,或者不想拼爹,最好的方法是拼實力。 合抱之木,生于毫末;九層之臺,起于壘土;千里之行,始于足下。 所以,你必須要從基層做起。當然,所謂的基…

java client_java中HttpClient的使用

HttpClient的使用步驟:1、使用Apache的HttpClient發送GET和POST請求的步驟如下:1. 使用幫助類HttpClients創建CloseableHttpClient對象. 2. 基于要發送的HTTP請求類型創建HttpGet或者HttpPost實例.3. 使用addHeader方法添加請求頭部,諸如User-Agent, Accept-Encodin…

java小項目實例,成功入職阿里

我聽到的一些發聲 你們賺的錢已經可以了: 我一個發小是做土木工程的,上海大學博士,參與很多著名建筑的工程,但是從薪資上看,還不如一些稍微像樣的公司的6年多的高級開發。為什么?這就是行業的紅利&#xf…

java屬于什么行業,吐血整理

微服務的發展 微服務倡導將復雜的單體應用拆分為若干個功能簡單、松耦合的服務,這樣可以降低開發難度、增強擴展性、便于敏捷開發。當前被越來越多的開發者推崇,很多互聯網行業巨頭、開源社區等都開始了微服務的討論和實踐。 微服務落地存在的問題 雖…

java struts2 ajax_在struts2的Action中返回Ajax數據

author:z_xiaofei168如何在struts2的action中返回數據(普通字符串、圖片)給ajax核心中的XMLHttpRequest對象。今天下午做項目,就是用戶注冊是時候,登錄名是否唯一,我用的ajax驗證,但怎么也不返回我想要的數據,糾結了老…

Nginx負載均衡策略有哪些?知識點總結+面試題解析

前言 看日期,今天都是4月了,這春招也差不多進入尾聲了。 近期任有不少朋友都在找工作,很多人開始抱怨,工作可真難找啊!身邊不少朋友問我咋搞呀,秋招都要結束了,工作還沒著落呢…額…這個…今年…

java bean jsp_JavaBean與Jsp

這一節我們總結一下JavaBean和Jsp的關系。1. JavaBeanjavaBean是一個遵循特定寫法的Java類,它通常具有如下特點:1)這個java類必須具有一個無參構造函數;2)屬性必須私有化;3)私有化的屬性必須通過public類型的方法暴露給其他程序&a…

P8級別的頂級“并發編程”寶典,最全指南

前言 前幾天我上班路上,和小區門口開車的師傅閑聊,發現他們雖然學歷不高,但掙錢的途徑不少,比如固定接送多位客戶,然后能通過朋友圈拓展新客戶,而且通過客戶口口相傳,也能不斷拉到生意&#xf…

java 追加寫入txt文件_ava如何追加寫入txt文件

(二)方法1public void method1() {FileWriter fw null;try {//如果文件存在,則追加內容;如果文件不存在,則創建文件File fnew File("E:\dd.txt");fw new FileWriter(f, true);} catch (IOException e) {e.printStackTrace();}Pri…

Redis宕機數據丟失解決方案,不吃透都對不起自己

前言 昨天,有個女孩子問我提高數據庫查詢性能有什么立竿見影的好方法? 這簡直是一道送分題,我自豪且略帶鄙夷的說,當然是加「索引」了。 她又不緊不慢的問,索引為什么就能提高查詢性能。 這還用問,索引…

c 加密 java解密錯誤_java解密出錯

展開全部你那個代碼少得東西太多,我左試右試,都是錯,也不知道你的初始32313133353236313431303231363533e78988e69d8331333332613762值都是什么。給你寫了一個加密解密的,希望對你有幫助。import java.security.NoSuchAlgorithmEx…

Redis成神之路電子版教程已問世,面試題+筆記+項目實戰

前言 我想對所有程序員說:除了看視頻、做項目來提高自身的技術之外,還有一種提升自己的專業技能就是:多!看!書!(本文內提到的書單筆者整理出了一份電子檔作為分享,文末有免費獲取方式…

java 中的event_Java中this與event有什么不同

Java中this與event有什么不同發布時間:2021-02-11 10:37:25來源:億速云閱讀:61作者:LeahJava中this與event有什么不同?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法&#xff…

Redis有幾種數據類型?文末領取面試資料

前言 其實前幾篇文章已經寫了好多有關于Spring源碼的文章,事實上,很多同學雖然一直在跟著閱讀、學習這些Spring的源碼教程,但是一直都很迷茫,這些Spring的源碼學習,似乎只是為了面試吹逼用,我大概問過一些…

java 多重屬性_最全面的44個Java 性能調優細節

我認為,代碼優化的最重要的作用應該是:避免未知的錯誤。在代碼上線運行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最后往往是一個非常小的原因。然而為了解決這個錯誤…

Redis靈魂14問?真香

前言 今日博主聽聞,現在很多培訓出來的應屆生薪資都趕上了摸爬滾打兩三年的朋友,講道理,這說不過去啊 作為同行來說,這個行業發展很快,技術更新很快,淘汰也很快,千萬不要再找借口了&#xff0…

java主流微服務框架_Spring Boot作為當下最流行的微服務開發框架,一名合格的Java開發者一定有所了解,...

Spring Boot作為當下最流行的微服務開發框架,一名合格的Java開發者一定有所了解,Spring Boot相對于傳統的SSM框架來說:springboot使用了特定的配置方式,開發人員不需要再定義樣板化的配置,簡化項目的初始構建springboo…

Redis面試復習大綱在手面試不慌,內含福利

前言 這幾年在Java工程師招聘時,會看到很多人的簡歷都寫著使用了Spring Cloud做微服務實現,使用Docker做自動化部署,并且也會把這些做為自己的亮點。而比較有趣的這其中以小公司出來的人為絕大多數,大的公司出來的人簡歷上倒是很…