日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

24个经典的MySQL索引问题,你都遇到过哪些?

發(fā)布時間:2025/3/12 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 24个经典的MySQL索引问题,你都遇到过哪些? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、什么是索引?

索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。

索引是一種數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)庫索引,是數(shù)據(jù)庫管理系統(tǒng)中一個排序的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更新數(shù)據(jù)庫表中數(shù)據(jù)。索引的實現(xiàn)通常使用B樹及其變種B+樹。

更通俗的說,索引就相當(dāng)于目錄。為了方便查找書中的內(nèi)容,通過對內(nèi)容建立索引形成目錄。索引是一個文件,它是要占據(jù)物理空間的。

2、索引有哪些優(yōu)缺點?

索引的優(yōu)點

(1)可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。

(2)通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。

索引的缺點

(1)時間方面:創(chuàng)建索引和維護(hù)索引要耗費時間,具體地,當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)的維護(hù),會降低增/改/刪的執(zhí)行效率;

(2)空間方面:索引需要占物理空間。

3、索引使用場景(重點)

where

上圖中,根據(jù)id查詢記錄,因為id字段僅建立了主鍵索引,因此此SQL執(zhí)行可選的索引只有主鍵索引,如果有多個,最終會選一個較優(yōu)的作為檢索的依據(jù)。

– 增加一個沒有建立索引的字段altertable innodb1 add sex char(1);
– 按sex檢索時可選的索引為nullEXPLAINSELECT*from innodb1 where sex=‘男’;

可以嘗試在一個字段未建立索引時,根據(jù)該字段查詢的效率,然后對該字段建立索引(alter table 表名 add index(字段名)),同樣的SQL執(zhí)行的效率,你會發(fā)現(xiàn)查詢效率會有明顯的提升(數(shù)據(jù)量越大越明顯)。

order by

當(dāng)我們使用order by將查詢結(jié)果按照某個字段排序時,如果該字段沒有建立索引,那么執(zhí)行計劃會將查詢出的所有數(shù)據(jù)使用外部排序(將數(shù)據(jù)從硬盤分批讀取到內(nèi)存使用內(nèi)部排序,最后合并排序結(jié)果),這個操作是很影響性能的,因為需要將查詢涉及到的所有數(shù)據(jù)從磁盤中讀到內(nèi)存(如果單條數(shù)據(jù)過大或者數(shù)據(jù)量過多都會降低效率),更無論讀到內(nèi)存之后的排序了。

但是如果我們對該字段建立索引alter table 表名 add index(字段名),那么由于索引本身是有序的,因此直接按照索引的順序和映射關(guān)系逐條取出數(shù)據(jù)即可。而且如果分頁的,那么只用取出索引表某個范圍內(nèi)的索引對應(yīng)的數(shù)據(jù),而不用像上述那取出所有數(shù)據(jù)進(jìn)行排序再返回某個范圍內(nèi)的數(shù)據(jù)。(從磁盤取數(shù)據(jù)是最影響性能的)

join

對join語句匹配關(guān)系(on)涉及的字段建立索引能夠提高效率

索引覆蓋

如果要查詢的字段都建立過索引,那么引擎會直接在索引表中查詢而不會訪問原始數(shù)據(jù)(否則只要有一個字段沒有建立索引就會做全表掃描),這叫索引覆蓋。因此我們需要盡可能的在select后只寫必要的查詢字段,以增加索引覆蓋的幾率。

這里值得注意的是不要想著為每個字段建立索引,因為優(yōu)先使用索引的優(yōu)勢就在于其體積小。

4、索引有哪幾種類型?

主鍵索引

數(shù)據(jù)列不允許重復(fù),不允許為NULL,一個表只能有一個主鍵。

唯一索引

數(shù)據(jù)列不允許重復(fù),允許為NULL值,一個表允許多個列創(chuàng)建唯一索引。

(1)可以通過 ALTER TABLE table_name ADD UNIQUE (column); 創(chuàng)建唯一索引

(2)可以通過 ALTER TABLE table_name ADD UNIQUE (column1,column2);創(chuàng)建唯一組合索引

普通索引

基本的索引類型,沒有唯一性的限制,允許為NULL值。

(1)可以通過ALTER TABLE table_name ADD INDEX index_name (column);創(chuàng)建普通索引

(2)可以通過ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);創(chuàng)建組合索引

全文索引

是目前搜索引擎使用的一種關(guān)鍵技術(shù)。

可以通過ALTER TABLE table_name ADD FULLTEXT (column);創(chuàng)建全文索引

5、索引的數(shù)據(jù)結(jié)構(gòu)(b樹,hash)

索引的數(shù)據(jù)結(jié)構(gòu)和具體存儲引擎的實現(xiàn)有關(guān),在MySQL中使用較多的索引有Hash索引,B+樹索引等,而我們經(jīng)常使用的InnoDB存儲引擎的默認(rèn)索引實現(xiàn)為:B+樹索引。對于哈希索引來說,底層的數(shù)據(jù)結(jié)構(gòu)就是哈希表,因此在絕大多數(shù)需求為單條記錄查詢的時候,可以選擇哈希索引,查詢性能最快;其余大部分場景,建議選擇BTree索引。

(1)B樹索引

mysql通過存儲引擎取數(shù)據(jù),基本上90%的人用的就是InnoDB了,按照實現(xiàn)方式分,InnoDB的索引類型目前只有兩種:BTREE(B樹)索引和HASH索引。B樹索引是Mysql數(shù)據(jù)庫中使用最頻繁的索引類型,基本所有存儲引擎都支持BTree索引。通常我們說的索引不出意外指的就是(B樹)索引(實際是用B+樹實現(xiàn)的,因為在查看表索引時,mysql一律打印BTREE,所以簡稱為B樹索引)

查詢方式:

主鍵索引區(qū):PI(關(guān)聯(lián)保存的時數(shù)據(jù)的地址)按主鍵查詢,

普通索引區(qū):si(關(guān)聯(lián)的id的地址,然后再到達(dá)上面的地址)。所以按主鍵查詢,速度最快

B+tree性質(zhì):

1)n棵子tree的節(jié)點包含n個關(guān)鍵字,不用來保存數(shù)據(jù)而是保存數(shù)據(jù)的索引。

2)所有的葉子結(jié)點中包含了全部關(guān)鍵字的信息,及指向含這些關(guān)鍵字記錄的指針,且葉子結(jié)點本身依關(guān)鍵字的大小自小而大順序鏈接。

3)所有的非終端結(jié)點可以看成是索引部分,結(jié)點中僅含其子樹中的最大(或最小)關(guān)鍵字。

4)B+ 樹中,數(shù)據(jù)對象的插入和刪除僅在葉節(jié)點上進(jìn)行。

5)B+樹有2個頭指針,一個是樹的根節(jié)點,一個是最小關(guān)鍵碼的葉節(jié)點。

(2)哈希索引

簡要說下,類似于數(shù)據(jù)結(jié)構(gòu)中簡單實現(xiàn)的HASH表(散列表)一樣,當(dāng)我們在mysql中用哈希索引時,主要就是通過Hash算法(常見的Hash算法有直接定址法、平方取中法、折疊法、除數(shù)取余法、隨機(jī)數(shù)法),將數(shù)據(jù)庫字段數(shù)據(jù)轉(zhuǎn)換成定長的Hash值,與這條數(shù)據(jù)的行指針一并存入Hash表的對應(yīng)位置;如果發(fā)生Hash碰撞(兩個不同關(guān)鍵字的Hash值相同),則在對應(yīng)Hash鍵下以鏈表形式存儲。當(dāng)然這只是簡略模擬圖。

6、索引的基本原理

索引用來快速地尋找那些具有特定值的記錄。如果沒有索引,一般來說執(zhí)行查詢時遍歷整張表。

索引的原理很簡單,就是把無序的數(shù)據(jù)變成有序的查詢

(1)把創(chuàng)建了索引的列的內(nèi)容進(jìn)行排序

(2)對排序結(jié)果生成倒排表

(3)在倒排表內(nèi)容上拼上數(shù)據(jù)地址鏈

(4)在查詢的時候,先拿到倒排表內(nèi)容,再取出數(shù)據(jù)地址鏈,從而拿到具體數(shù)據(jù)

7、索引算法有哪些?

索引算法有 BTree算法和Hash算法

BTree算法

BTree是最常用的mysql數(shù)據(jù)庫索引算法,也是mysql默認(rèn)的算法。因為它不僅可以被用在=,>,>=,<,<=和between這些比較操作符上,而且還可以用于like操作符,只要它的查詢條件是一個不以通配符開頭的常量, 例如:

– 只要它的查詢條件是一個不以通配符開頭的常量selectfromuserwhere name like’jack%’;
– 如果一通配符開頭,或者沒有使用常量,則不會使用索引,例如: selectfromuserwhere name like’%jack’;

Hash算法

Hash Hash索引只能用于對等比較,例如=,<=>(相當(dāng)于=)操作符。由于是一次定位數(shù)據(jù),不像BTree索引需要從根節(jié)點到枝節(jié)點,最后才能訪問到頁節(jié)點這樣多次IO訪問,所以檢索效率遠(yuǎn)高于BTree索引。

8、索引設(shè)計的原則?

(1)適合索引的列是出現(xiàn)在where子句中的列,或者連接子句中指定的列

(2)基數(shù)較小的類,索引效果較差,沒有必要在此列建立索引

(3)使用短索引,如果對長字符串列進(jìn)行索引,應(yīng)該指定一個前綴長度,這樣能夠節(jié)省大量索引空間

(4)不要過度索引。索引需要額外的磁盤空間,并降低寫操作的性能。在修改表內(nèi)容的時候,索引會進(jìn)行更新甚至重構(gòu),索引列越多,這個時間就會越長。所以只保持需要的索引有利于查詢即可。

9、創(chuàng)建索引的原則(重中之重)

索引雖好,但也不是無限制的使用,最好符合一下幾個原則

1) 最左前綴匹配原則,組合索引非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整。

2)較頻繁作為查詢條件的字段才去創(chuàng)建索引

3)更新頻繁字段不適合創(chuàng)建索引

4)若是不能有效區(qū)分?jǐn)?shù)據(jù)的列不適合做索引列(如性別,男女未知,最多也就三種,區(qū)分度實在太低)

5)盡量的擴(kuò)展索引,不要新建索引。比如表中已經(jīng)有a的索引,現(xiàn)在要加(a,b)的索引,那么只需要修改原來的索引即可。

6)定義有外鍵的數(shù)據(jù)列一定要建立索引。

7)對于那些查詢中很少涉及的列,重復(fù)值比較多的列不要建立索引。

8)對于定義為text、image和bit的數(shù)據(jù)類型的列不要建立索引。

10、創(chuàng)建索引的三種方式,刪除索引

第一種方式:在執(zhí)行CREATE TABLE時創(chuàng)建索引

CREATETABLE user_index2 (

第二種方式:使用ALTER TABLE命令去增加索引

ALTERTABLE table_name ADDINDEX index_name (column_list);
ALTER TABLE用來創(chuàng)建普通索引、UNIQUE索引或PRIMARY KEY索引。

其中table_name是要增加索引的表名,column_list指出對哪些列進(jìn)行索引,多列時各列之間用逗號分隔。

索引名index_name可自己命名,缺省時,MySQL將根據(jù)第一個索引列賦一個名稱。另外,ALTER TABLE允許在單個語句中更改多個表,因此可以在同時創(chuàng)建多個索引。

第三種方式:使用CREATE INDEX命令創(chuàng)建

CREATEINDEX index_name ON table_name (column_list);
CREATE INDEX可對表增加普通索引或UNIQUE索引。(但是,不能創(chuàng)建PRIMARY KEY索引)

刪除索引

根據(jù)索引名刪除普通索引、唯一索引、全文索引:

ALTER TABLE 表名 DROP KEY 索引名 altertable user_index dropKEY NAME;
altertable user_index dropKEY id_card;
altertable user_index dropKEY information;
刪除主鍵索引:alter table 表名 drop primary key(因為主鍵只有一個)。這里值得注意的是,如果主鍵自增長,那么不能直接執(zhí)行此操作(自增長依賴于主鍵索引):

需要取消自增長再行刪除:

altertable user_index – 重新定義字段MODIFY id int,dropPRIMARYKEY
但通常不會刪除主鍵,因為設(shè)計主鍵一定與業(yè)務(wù)邏輯無關(guān)。

11、創(chuàng)建索引時需要注意什么?

(1)非空字段:

應(yīng)該指定列為NOT NULL,除非你想存儲NULL。在mysql中,含有空值的列很難進(jìn)行查詢優(yōu)化,因為它們使得索引、索引的統(tǒng)計信息以及比較運算更加復(fù)雜。你應(yīng)該用0、一個特殊的值或者一個空串代替空值;

(2)取值離散大的字段:

(變量各個取值之間的差異程度)的列放到聯(lián)合索引的前面,可以通過count()函數(shù)查看字段的差異值,返回值越大說明字段的唯一值越多字段的離散程度高;

(3)索引字段越小越好:

數(shù)據(jù)庫的數(shù)據(jù)存儲以頁為單位一頁存儲的數(shù)據(jù)越多一次IO操作獲取的數(shù)據(jù)越大效率越高。

12、使用索引查詢一定能提高查詢的性能嗎?為什么

通常,通過索引查詢數(shù)據(jù)比全表掃描要快。但是我們也必須注意到它的代價。

(1)索引需要空間來存儲,也需要定期維護(hù), 每當(dāng)有記錄在表中增減或索引列被修改時,索引本身也會被修改。 這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5 次的磁盤I/O。 因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應(yīng)時間變慢。使用索引查詢不一定能提高查詢性能,索引范圍查詢(INDEX RANGE SCAN)適用于兩種情況:

(2)基于一個范圍的檢索,一般查詢返回結(jié)果集小于表中記錄數(shù)的30%

(3)基于非唯一性索引的檢索

13、百萬級別或以上的數(shù)據(jù)如何刪除

關(guān)于索引:由于索引需要額外的維護(hù)成本,因為索引文件是單獨存在的文件,所以當(dāng)我們對數(shù)據(jù)的增加,修改,刪除,都會產(chǎn)生額外的對索引文件的操作,這些操作需要消耗額外的IO,會降低增/改/刪的執(zhí)行效率。所以,在我們刪除數(shù)據(jù)庫百萬級別數(shù)據(jù)的時候,查詢MySQL官方手冊得知刪除數(shù)據(jù)的速度和創(chuàng)建的索引數(shù)量是成正比的。

(1)所以我們想要刪除百萬數(shù)據(jù)的時候可以先刪除索引(此時大概耗時三分多鐘)

(2)然后刪除其中無用數(shù)據(jù)(此過程需要不到兩分鐘)

(3)刪除完成后重新創(chuàng)建索引(此時數(shù)據(jù)較少了)創(chuàng)建索引也非常快,約十分鐘左右。

(4)與之前的直接刪除絕對是要快速很多,更別說萬一刪除中斷,一切刪除會回滾。那更是坑了。

14、前綴索引

語法:index(field(10)),使用字段值的前10個字符建立索引,默認(rèn)是使用字段的全部內(nèi)容建立索引。

前提:前綴的標(biāo)識度高。比如密碼就適合建立前綴索引,因為密碼幾乎各不相同。

實操的難度:在于前綴截取的長度。

我們可以利用select count(*)/count(distinct left(password,prefixLen));,通過從調(diào)整prefixLen的值(從1自增)查看不同前綴長度的一個平均匹配度,接近1時就可以了(表示一個密碼的前prefixLen個字符幾乎能確定唯一一條記錄)

15、什么是最左前綴原則?什么是最左匹配原則

(1)顧名思義,就是最左優(yōu)先,在創(chuàng)建多列索引時,要根據(jù)業(yè)務(wù)需求,where子句中使用最頻繁的一列放在最左邊。

(2)最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整。

(3)=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優(yōu)化器會幫你優(yōu)化成索引可以識別的形式

16、B樹和B+樹的區(qū)別

(1)在B樹中,你可以將鍵和值存放在內(nèi)部節(jié)點和葉子節(jié)點;但在B+樹中,內(nèi)部節(jié)點都是鍵,沒有值,葉子節(jié)點同時存放鍵和值。

(2)B+樹的葉子節(jié)點有一條鏈相連,而B樹的葉子節(jié)點各自獨立。

17、使用B樹的好處

B樹可以在內(nèi)部節(jié)點同時存儲鍵和值,因此,把頻繁訪問的數(shù)據(jù)放在靠近根節(jié)點的地方將會大大提高熱點數(shù)據(jù)的查詢效率。這種特性使得B樹在特定數(shù)據(jù)重復(fù)多次查詢的場景中更加高效。

18、使用B+樹的好處

由于B+樹的內(nèi)部節(jié)點只存放鍵,不存放值,因此,一次讀取,可以在內(nèi)存頁中獲取更多的鍵,有利于更快地縮小查找范圍。 B+樹的葉節(jié)點由一條鏈相連,因此,當(dāng)需要進(jìn)行一次全數(shù)據(jù)遍歷的時候,B+樹只需要使用O(logN)時間找到最小的一個節(jié)點,然后通過鏈進(jìn)行O(N)的順序遍歷即可。而B樹則需要對樹的每一層進(jìn)行遍歷,這會需要更多的內(nèi)存置換次數(shù),因此也就需要花費更多的時間

19、Hash索引和B+樹所有有什么區(qū)別或者說優(yōu)劣呢?

首先要知道Hash索引和B+樹索引的底層實現(xiàn)原理:

hash索引底層就是hash表,進(jìn)行查找時,調(diào)用一次hash函數(shù)就可以獲取到相應(yīng)的鍵值,之后進(jìn)行回表查詢獲得實際數(shù)據(jù)。B+樹底層實現(xiàn)是多路平衡查找樹。對于每一次的查詢都是從根節(jié)點出發(fā),查找到葉子節(jié)點方可以獲得所查鍵值,然后根據(jù)查詢判斷是否需要回表查詢數(shù)據(jù)。

那么可以看出他們有以下的不同:

  • hash索引進(jìn)行等值查詢更快(一般情況下),但是卻無法進(jìn)行范圍查詢。

因為在hash索引中經(jīng)過hash函數(shù)建立索引之后,索引的順序與原順序無法保持一致,不能支持范圍查詢。而B+樹的的所有節(jié)點皆遵循(左節(jié)點小于父節(jié)點,右節(jié)點大于父節(jié)點,多叉樹也類似),天然支持范圍。

  • hash索引不支持使用索引進(jìn)行排序,原理同上。
  • hash索引不支持模糊查詢以及多列索引的最左前綴匹配。原理也是因為hash函數(shù)的不可預(yù)測。AAAA和AAAAB的索引沒有相關(guān)性。
  • hash索引任何時候都避免不了回表查詢數(shù)據(jù),而B+樹在符合某些條件(聚簇索引,覆蓋索引等)的時候可以只通過索引完成查詢。
  • hash索引雖然在等值查詢上較快,但是不穩(wěn)定。性能不可預(yù)測,當(dāng)某個鍵值存在大量重復(fù)的時候,發(fā)生hash碰撞,此時效率可能極差。而B+樹的查詢效率比較穩(wěn)定,對于所有的查詢都是從根節(jié)點到葉子節(jié)點,且樹的高度較低。

因此,在大多數(shù)情況下,直接選擇B+樹索引可以獲得穩(wěn)定且較好的查詢速度。而不需要使用hash索引。

20、數(shù)據(jù)庫為什么使用B+樹而不是B樹

(1)B樹只適合隨機(jī)檢索,而B+樹同時支持隨機(jī)檢索和順序檢索;

(2)B+樹空間利用率更高,可減少I/O次數(shù),磁盤讀寫代價更低。一般來說,索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤I/O消耗。B+樹的內(nèi)部結(jié)點并沒有指向關(guān)鍵字具體信息的指針,只是作為索引使用,其內(nèi)部結(jié)點比B樹小,盤塊能容納的結(jié)點中關(guān)鍵字?jǐn)?shù)量更多,一次性讀入內(nèi)存中可以查找的關(guān)鍵字也就越多,相對的,IO讀寫次數(shù)也就降低了。而IO讀寫次數(shù)是影響索引檢索效率的最大因素;

(3)B+樹的查詢效率更加穩(wěn)定。B樹搜索有可能會在非葉子結(jié)點結(jié)束,越靠近根節(jié)點的記錄查找時間越短,只要找到關(guān)鍵字即可確定記錄的存在,其性能等價于在關(guān)鍵字全集內(nèi)做一次二分查找。而在B+樹中,順序檢索比較明顯,隨機(jī)檢索時,任何關(guān)鍵字的查找都必須走一條從根節(jié)點到葉節(jié)點的路,所有關(guān)鍵字的查找路徑長度相同,導(dǎo)致每一個關(guān)鍵字的查詢效率相當(dāng)。

(4)B-樹在提高了磁盤IO性能的同時并沒有解決元素遍歷的效率低下的問題。B+樹的葉子節(jié)點使用指針順序連接在一起,只要遍歷葉子節(jié)點就可以實現(xiàn)整棵樹的遍歷。而且在數(shù)據(jù)庫中基于范圍的查詢是非常頻繁的,而B樹不支持這樣的操作。

(5)增刪文件(節(jié)點)時,效率更高。因為B+樹的葉子節(jié)點包含所有關(guān)鍵字,并以有序的鏈表結(jié)構(gòu)存儲,這樣可很好提高增刪效率。

21、B+樹在滿足聚簇索引和覆蓋索引的時候不需要回表查詢數(shù)據(jù),

在B+樹的索引中,葉子節(jié)點可能存儲了當(dāng)前的key值,也可能存儲了當(dāng)前的key值以及整行的數(shù)據(jù),這就是聚簇索引和非聚簇索引。 在InnoDB中,只有主鍵索引是聚簇索引,如果沒有主鍵,則挑選一個唯一鍵建立聚簇索引。如果沒有唯一鍵,則隱式的生成一個鍵來建立聚簇索引。

當(dāng)查詢使用聚簇索引時,在對應(yīng)的葉子節(jié)點,可以獲取到整行數(shù)據(jù),因此不用再次進(jìn)行回表查詢。

22、什么是聚簇索引?何時使用聚簇索引與非聚簇索引

(1)聚簇索引:將數(shù)據(jù)存儲與索引放到了一塊,找到索引也就找到了數(shù)據(jù)

(2)非聚簇索引:將數(shù)據(jù)存儲于索引分開結(jié)構(gòu),索引結(jié)構(gòu)的葉子節(jié)點指向了數(shù)據(jù)的對應(yīng)行,myisam通過key_buffer把索引先緩存到內(nèi)存中,當(dāng)需要訪問數(shù)據(jù)時(通過索引訪問數(shù)據(jù)),在內(nèi)存中直接搜索索引,然后通過索引找到磁盤相應(yīng)數(shù)據(jù),這也就是為什么索引不在key buffer命中時,速度慢的原因

澄清一個概念:innodb中,在聚簇索引之上創(chuàng)建的索引稱之為輔助索引,輔助索引訪問數(shù)據(jù)總是需要二次查找,非聚簇索引都是輔助索引,像復(fù)合索引、前綴索引、唯一索引,輔助索引葉子節(jié)點存儲的不再是行的物理位置,而是主鍵值

何時使用聚簇索引與非聚簇索引

23、非聚簇索引一定會回表查詢嗎?

不一定,這涉及到查詢語句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再進(jìn)行回表查詢。

舉個簡單的例子,假設(shè)我們在員工表的年齡上建立了索引,那么當(dāng)進(jìn)行select age from employee where age < 20的查詢時,在索引的葉子節(jié)點上,已經(jīng)包含了age信息,不會再次進(jìn)行回表查詢。

24、聯(lián)合索引是什么?為什么需要注意聯(lián)合索引中的順序?

MySQL可以使用多個字段同時建立一個索引,叫做聯(lián)合索引。在聯(lián)合索引中,如果想要命中索引,需要按照建立索引時的字段順序挨個使用,否則無法命中索引。

具體原因為:

MySQL使用索引時需要索引有序,假設(shè)現(xiàn)在建立了"name,age,school"的聯(lián)合索引,那么索引的排序為: 先按照name排序,如果name相同,則按照age排序,如果age的值也相等,則按照school進(jìn)行排序。

當(dāng)進(jìn)行查詢時,此時索引僅僅按照name嚴(yán)格有序,因此必須首先使用name字段進(jìn)行等值查詢,之后對于匹配到的列而言,其按照age字段嚴(yán)格有序,此時可以使用age字段用做索引查找,以此類推。因此在建立聯(lián)合索引的時候應(yīng)該注意索引列的順序,一般情況下,將查詢需求頻繁或者字段選擇性高的列放在前面。此外可以根據(jù)特例的查詢或者表結(jié)構(gòu)進(jìn)行單獨的調(diào)整。

總結(jié)

以上是生活随笔為你收集整理的24个经典的MySQL索引问题,你都遇到过哪些?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。