MySQL中的聚集索引、二級(jí)索引使用解讀
以下是關(guān)于聚集索引、二級(jí)索引(非聚集索引)以及回表查詢的重點(diǎn)內(nèi)容:

聚集索引
定義與特點(diǎn):聚集索引是將數(shù)據(jù)存儲(chǔ)與索引放在一塊兒,B樹(shù)索引結(jié)構(gòu)的葉子節(jié)點(diǎn)保存了整行數(shù)據(jù),并且有且只能有一個(gè),通常情況下是主鍵。
選舉規(guī)則
- 若表中有主鍵,那么主鍵就是聚集索引。
- 若表沒(méi)有主鍵,會(huì)查看是否有唯一索引,若有則將唯一索引當(dāng)作聚集索引。
- 若表既沒(méi)有主鍵也沒(méi)有唯一索引,InnoDB引擎會(huì)自動(dòng)生成一個(gè)隱藏的聚集索引。

二級(jí)索引(非聚集索引)
- 定義與特點(diǎn):二級(jí)索引將數(shù)據(jù)與索引分開(kāi)存儲(chǔ),B樹(shù)索引結(jié)構(gòu)的葉子節(jié)點(diǎn)關(guān)聯(lián)的是對(duì)應(yīng)的主鍵,一個(gè)表中可以有多個(gè)二級(jí)索引。
- 存儲(chǔ)結(jié)構(gòu)示例:以給表中的name字段添加索引為例,其在B樹(shù)中葉子節(jié)點(diǎn)存儲(chǔ)的是對(duì)應(yīng)數(shù)據(jù)的主鍵值,而非整行數(shù)據(jù),這與聚集索引存儲(chǔ)整行數(shù)據(jù)不同。
回表查詢

過(guò)程示例:
- 假設(shè)有查詢語(yǔ)句
select * from user where name = 'arm',由于給name字段添加了索引, - 會(huì)先走二級(jí)索引。從根節(jié)點(diǎn)開(kāi)始比對(duì),
- 找到對(duì)應(yīng)的節(jié)點(diǎn)(如找到arm對(duì)應(yīng)的節(jié)點(diǎn)),但此時(shí)二級(jí)索引只能拿到主鍵值(如10),
- 因?yàn)椴樵冋Z(yǔ)句是“select *”需要整行數(shù)據(jù),所以要拿著主鍵值(10)再到聚集索引中查找。
- 在聚集索引中同樣從根節(jié)點(diǎn)比對(duì),最終定位到整行數(shù)據(jù)。
定義:
- 先通過(guò)二級(jí)索引找到對(duì)應(yīng)的主鍵值,然后拿到主鍵再到聚集索引中找到整行數(shù)據(jù)的過(guò)程就是回表查詢。
面試回答技巧
- 當(dāng)被問(wèn)到“什么是聚集索引和非聚集索引”時(shí),回答應(yīng)包含聚集索引是數(shù)據(jù)與索引放一塊,葉子節(jié)點(diǎn)存整行數(shù)據(jù),一般是主鍵且只有一個(gè);二級(jí)索引(非聚集索引)是數(shù)據(jù)與索引分開(kāi)存,葉子節(jié)點(diǎn)存主鍵值,可以有多個(gè),單獨(dú)給字段創(chuàng)建的索引大多是二級(jí)索引。
- 當(dāng)被問(wèn)到“什么是回表查詢”時(shí),先介紹聚集索引和二級(jí)索引的概念,再解釋回表查詢是先通過(guò)二級(jí)索引找主鍵值,再用主鍵到聚集索引找整行數(shù)據(jù)的過(guò)程。實(shí)際面試中,即使面試官直接問(wèn)回表查詢,也應(yīng)先介紹索引相關(guān)概念再解釋回表查詢。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql派生表(Derived Table)簡(jiǎn)單用法實(shí)例解析
這篇文章主要介紹了mysql派生表(Derived Table)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了mysql派生表的原理、簡(jiǎn)單使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-12-12
mysql5.x升級(jí)到mysql5.7后導(dǎo)入之前數(shù)據(jù)庫(kù)date出錯(cuò)的快速解決方法
這篇文章主要介紹了mysql5.x升級(jí)到mysql5.7后導(dǎo)入之前數(shù)據(jù)庫(kù)date出錯(cuò)的快速解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
MySql 5.7.17 winx64的安裝配置詳細(xì)教程
這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫(kù)、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下2017-01-01
mysql數(shù)據(jù)庫(kù)的分區(qū)表示例代碼
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)的分區(qū)表的相關(guān)資料,文章介紹了兩種創(chuàng)建SQL表分區(qū)的方法,分別是手動(dòng)創(chuàng)建和使用MySQL的定時(shí)事件來(lái)自動(dòng)創(chuàng)建分區(qū),手動(dòng)創(chuàng)建分區(qū)時(shí),需要在代碼中判斷分區(qū)并新增,可能會(huì)引入一些問(wèn)題,需要的朋友可以參考下2024-11-11

