www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]有位朋友去阿里面試,他說面試官給了幾條查詢SQL,問:需要執(zhí)行幾次樹搜索操作?

前言

有位朋友去阿里面試,他說面試官給了幾條查詢SQL,問:需要執(zhí)行幾次樹搜索操作?我朋友當(dāng)時(shí)是有點(diǎn)懵的,后來冷靜思考,才發(fā)現(xiàn)就是考索引的幾個(gè)基礎(chǔ)知識(shí)點(diǎn)~~ 本文我們分九個(gè)索引知識(shí)點(diǎn),一起來探討一下。如果有不正確的話,歡迎指出哈,一起學(xué)習(xí)~

  • 面試官考點(diǎn)之索引是什么?
  • 面試官考點(diǎn)之索引類型
  • 面試官考點(diǎn)之為什么選擇B+樹作索引結(jié)構(gòu)
  • 面試官考點(diǎn)之一次索引搜索過程
  • 面試官考點(diǎn)之覆蓋索引
  • 面試官考點(diǎn)之索引失效場(chǎng)景
  • 面試官考點(diǎn)之最左前綴
  • 面試官考點(diǎn)之索引下推
  • 面試官考點(diǎn)之大表添加索引

一、面試官考點(diǎn)之索引是什么?

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?
  • 索引是一種能提高數(shù)據(jù)庫查詢效率的數(shù)據(jù)結(jié)構(gòu)。它可以比作一本字典的目錄,可以幫你快速找到對(duì)應(yīng)的記錄。
  • 索引一般存儲(chǔ)在磁盤的文件中,它是占用物理空間的。
  • 正所謂水能載舟,也能覆舟。適當(dāng)?shù)乃饕芴岣卟樵冃?,過多的索引會(huì)影響數(shù)據(jù)庫表的插入和更新功能。

二、索引有哪些類型類型

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

數(shù)據(jù)結(jié)構(gòu)維度

  • B+樹索引:所有數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn),復(fù)雜度為O(logn),適合范圍查詢。
  • 哈希索引:  適合等值查詢,檢索效率高,一次到位。
  • 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本類型char,text,varchar類型上創(chuàng)建。
  • R-Tree索引: 用來對(duì)GIS數(shù)據(jù)類型創(chuàng)建SPATIAL索引

物理存儲(chǔ)維度

  • 聚集索引:聚集索引就是以主鍵創(chuàng)建的索引,在葉子節(jié)點(diǎn)存儲(chǔ)的是表中的數(shù)據(jù)。
  • 非聚集索引:非聚集索引就是以非主鍵創(chuàng)建的索引,在葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵和索引列。

邏輯維度

  • 主鍵索引:一種特殊的唯一索引,不允許有空值。
  • 普通索引:MySQL中基本索引類型,允許空值和重復(fù)值。
  • 聯(lián)合索引:多個(gè)字段創(chuàng)建的索引,使用時(shí)遵循最左前綴原則。
  • 唯一索引:索引列中的值必須是唯一的,但是允許為空值。
  • 空間索引:MySQL5.7之后支持空間索引,在空間索引這方面遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則。

三、面試官考點(diǎn)之為什么選擇B+樹作為索引結(jié)構(gòu)

可以從這幾個(gè)維度去看這個(gè)問題,查詢是否夠快,效率是否穩(wěn)定,存儲(chǔ)數(shù)據(jù)多少,以及查找磁盤次數(shù)等等。為什么不是哈希結(jié)構(gòu)?為什么不是二叉樹,為什么不是平衡二叉樹,為什么不是B樹,而偏偏是B+樹呢?

我們寫業(yè)務(wù)SQL查詢時(shí),大多數(shù)情況下,都是范圍查詢的,如下SQL

select * from employee where age between 18 and 28;

為什么不使用哈希結(jié)構(gòu)?

我們知道哈希結(jié)構(gòu),類似k-v結(jié)構(gòu),也就是,key和value是一對(duì)一關(guān)系。它用于「等值查詢」還可以,但是范圍查詢它是無能為力的哦。

為什么不使用二叉樹呢?

先回憶下二叉樹相關(guān)知識(shí)啦~ 所謂「二叉樹,特點(diǎn)如下:」

  • 每個(gè)結(jié)點(diǎn)最多兩個(gè)子樹,分別稱為左子樹和右子樹。
  • 左子節(jié)點(diǎn)的值小于當(dāng)前節(jié)點(diǎn)的值,當(dāng)前節(jié)點(diǎn)值小于右子節(jié)點(diǎn)值
  • 頂端的節(jié)點(diǎn)稱為根節(jié)點(diǎn),沒有子節(jié)點(diǎn)的節(jié)點(diǎn)值稱為葉子節(jié)點(diǎn)。

我們腦海中,很容易就浮現(xiàn)出這種二叉樹結(jié)構(gòu)圖:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

但是呢,有些特殊二叉樹,它可能這樣的哦:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

如果二叉樹特殊化為一個(gè)鏈表,相當(dāng)于全表掃描。那么還要索引干嘛呀?因此,一般二叉樹不適合作為索引結(jié)構(gòu)。

為什么不使用平衡二叉樹呢?

平衡二叉樹特點(diǎn):它也是一顆二叉查找樹,任何節(jié)點(diǎn)的兩個(gè)子樹高度最大差為1。所以就不會(huì)出現(xiàn)特殊化一個(gè)鏈表的情況啦。

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

但是呢:

  • 平衡二叉樹插入或者更新時(shí),需要左旋右旋維持平衡,維護(hù)代價(jià)大
  • 如果數(shù)量多的話,樹的高度會(huì)很高。因?yàn)閿?shù)據(jù)是存在磁盤的,以它作為索引結(jié)構(gòu),每次從磁盤讀取一個(gè)節(jié)點(diǎn),操作IO的次數(shù)就多啦。

為什么不使用B樹呢?

數(shù)據(jù)量大的話,平衡二叉樹的高度會(huì)很高,會(huì)增加IO嘛。那為什么不選擇同樣數(shù)據(jù)量,「高度更矮的B樹」呢?

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

B樹相對(duì)于平衡二叉樹,就可以存儲(chǔ)更多的數(shù)據(jù),高度更低。但是最后為甚選擇B+樹呢?因?yàn)锽+樹是B樹的升級(jí)版:

  • B+樹非葉子節(jié)點(diǎn)上是不存儲(chǔ)數(shù)據(jù)的,僅存儲(chǔ)鍵值,而B樹節(jié)點(diǎn)中不僅存儲(chǔ)鍵值,也會(huì)存儲(chǔ)數(shù)據(jù)。innodb中頁的默認(rèn)大小是16KB,如果不存儲(chǔ)數(shù)據(jù),那么就會(huì)存儲(chǔ)更多的鍵值,相應(yīng)的樹的階數(shù)(節(jié)點(diǎn)的子節(jié)點(diǎn)樹)就會(huì)更大,樹就會(huì)更矮更胖,如此一來我們查找數(shù)據(jù)進(jìn)行磁盤的IO次數(shù)有會(huì)再次減少,數(shù)據(jù)查詢的效率也會(huì)更快。
  • B+樹索引的所有數(shù)據(jù)均存儲(chǔ)在葉子節(jié)點(diǎn),而且數(shù)據(jù)是按照順序排列的,鏈表連著的。那么B+樹使得范圍查找,排序查找,分組查找以及去重查找變得異常簡(jiǎn)單。

四、面試官考點(diǎn)之一次B+樹索引搜索過程

「面試官:」 假設(shè)有以下表結(jié)構(gòu),并且有這幾條數(shù)據(jù)

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `sex` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into employee values(100,'小倫',43,'2021-01-20','0');
insert into employee values(200,'俊杰',48,'2021-01-21','0');
insert into employee values(300,'紫琪',36,'2020-01-21','1');
insert into employee values(400,'立紅',32,'2020-01-21','0');
insert into employee values(500,'易迅',37,'2020-01-21','1');
insert into employee values(600,'小軍',49,'2021-01-21','0');
insert into employee values(700,'小燕',28,'2021-01-21','1');

「面試官:」 如果執(zhí)行以下的查詢SQL,需要執(zhí)行幾次的樹搜索操作?可以畫下對(duì)應(yīng)的索引結(jié)構(gòu)圖~

select * from Temployee where age=32;

「解析:」 其實(shí)這個(gè),面試官就是考察候選人是否熟悉B+樹索引結(jié)構(gòu)圖??梢韵襻u紫回答~

  • 先畫出 idx_age索引的索引結(jié)構(gòu)圖,大概如下:



阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

  • 再畫出id主鍵索引,我們先畫出聚族索引結(jié)構(gòu)圖,如下:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

因此,這條 SQL 查詢語句執(zhí)行大概流程就是醬紫:

  1. 搜索 idx_age索引樹,將磁盤塊1加載到內(nèi)存,由于32<37,搜索左路分支,到磁盤尋址磁盤塊2。? ? ? ? ? ? ? ? ? ? ? ? ? ?
  2. 將磁盤塊2加載到內(nèi)存中,在內(nèi)存繼續(xù)遍歷,找到age=32的記錄,取得id = 400.
  3. 拿到id=400后,回到id主鍵索引樹。
  4. 搜索 id主鍵索引樹,將磁盤塊1加載內(nèi)存,在內(nèi)存遍歷,找到了400,但是B+樹索引非葉子節(jié)點(diǎn)是不保存數(shù)據(jù)的。索引會(huì)繼續(xù)搜索400的右分支,到磁盤尋址磁盤塊3.
  5. 將磁盤塊3加載內(nèi)存,在內(nèi)存遍歷,找到id=400的記錄,拿到R4這一行的數(shù)據(jù),好的,大功告成。

因此,這個(gè)SQL查詢,執(zhí)行了幾次樹的搜索操作,是不是一步了然了呀。「特別的」,在idx_age二級(jí)索引樹找到主鍵id后,回到id主鍵索引搜索的過程,就稱為回表。

什么是回表?拿到主鍵再回到主鍵索引查詢的過程,就叫做「回表」

五、面試官考點(diǎn)之覆蓋索引

「面試官:」 如果不用select *, 而是使用select id,age,以上的題目執(zhí)行了幾次樹搜索操作呢?

「解析:」 這個(gè)問題,主要考察候選人的覆蓋索引知識(shí)點(diǎn)。回到idx_age索引樹,你可以發(fā)現(xiàn)查詢選項(xiàng)id和age都在葉子節(jié)點(diǎn)上了。因此,可以直接提供查詢結(jié)果啦,根本就不需要再回表了~







阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

覆蓋索引:在查詢的數(shù)據(jù)列里面,不需要回表去查,直接從索引列就能取到想要的結(jié)果。換句話說,你SQL用到的索引列數(shù)據(jù),覆蓋了查詢結(jié)果的列,就算上覆蓋索引了。

所以,相對(duì)于上個(gè)問題,就是省去了回表的樹搜索操作。

六、面試官考點(diǎn)之索引失效

「面試官:」 如果我現(xiàn)在給name字段加上普通索引,然后用個(gè)like模糊搜索,那會(huì)執(zhí)行多少次查詢呢?SQL如下:

select * from employee where name like '%杰倫%';

「解析:」 這里考察的知識(shí)點(diǎn)就是,like是否會(huì)導(dǎo)致不走索引,看先該SQL的explain執(zhí)行計(jì)劃吧。其實(shí)like 模糊搜索,會(huì)導(dǎo)致不走索引的,如下:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

因此,這條SQL最后就全表掃描啦~日常開發(fā)中,這幾種騷操作都可能會(huì)導(dǎo)致索引失效,如下:

  • 查詢條件包含or,可能導(dǎo)致索引失效
  • 如何字段類型是字符串,where時(shí)一定用引號(hào)括起來,否則索引失效
  • like通配符可能導(dǎo)致索引失效。
  • 聯(lián)合索引,查詢時(shí)的條件列不是聯(lián)合索引中的第一個(gè)列,索引失效。
  • 在索引列上使用mysql的內(nèi)置函數(shù),索引失效。
  • 對(duì)索引列運(yùn)算(如,+、-、*、/),索引失效。
  • 索引字段上使用(!= 或者 < >,not in)時(shí),可能會(huì)導(dǎo)致索引失效。
  • 索引字段上使用is null, is not null,可能導(dǎo)致索引失效。
  • 左連接查詢或者右連接查詢查詢關(guān)聯(lián)的字段編碼格式不一樣,可能導(dǎo)致索引失效。
  • mysql估計(jì)使用全表掃描要比使用索引快,則不使用索引。

七、面試官考點(diǎn)聯(lián)合索引之最左前綴原則

「面試官:」 如果我現(xiàn)在給name,age字段加上聯(lián)合索引索引,以下SQL執(zhí)行多少次樹搜索呢?先畫下索引樹?

select * from employee where name like '小%' order by age desc;

「解析:」 這里考察聯(lián)合索引的最左前綴原則以及l(fā)ike是否中索引的知識(shí)點(diǎn)。組合索引樹示意圖大概如下:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

聯(lián)合索引項(xiàng)是先按姓名name從小到大排序,如果名字name相同,則按年齡age從小到大排序。面試官要求查所有名字第一個(gè)字是“小”的人,SQL的like '小%'是可以用上idx_name_age聯(lián)合索引的。

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

該查詢會(huì)沿著idx_name_age索引樹,找到第一個(gè)字是小的索引值,因此依次找到小軍、小倫、小燕、,分別拿到Id=600、100、700,然后回三次表,去找對(duì)應(yīng)的記錄。這里面的最左前綴小,就是字符串索引的最左M個(gè)字符。實(shí)際上,

  • 這個(gè)最左前綴可以是聯(lián)合索引的最左N個(gè)字段。比如組合索引(a,b,c)可以相當(dāng)于建了(a),(a,b),(a,b,c)三個(gè)索引,大大提高了索引復(fù)用能力。
  • 最左前綴也可以是字符串索引的最左M個(gè)字符。


八、面試官考點(diǎn)之索引下推

「面試官:」 我們還是居于組合索引 idx_name_age,以下這個(gè)SQL執(zhí)行幾次樹搜索呢?

select * from employee where name like '小%' and age=28 and sex='0';

「解析:」 這里考察索引下推的知識(shí)點(diǎn),如果是「Mysql5.6之前」,在idx_name_age索引樹,找出所有名字第一個(gè)字是“小”的人,拿到它們的主鍵id,然后回表找出數(shù)據(jù)行,再去對(duì)比年齡和性別等其他字段。如圖:

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

有些朋友可能覺得奇怪,(name,age)不是聯(lián)合索引嘛?為什么選出包含“小”字后,不再順便看下年齡age再回表呢,不是更高效嘛?所以呀,MySQL 5.6 就引入了「索引下推優(yōu)化」,可以在索引遍歷過程中,對(duì)索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數(shù)。

因此,MySQL5.6版本之后,選出包含“小”字后,順表過濾age=28,,所以就只需一次回表。

阿里一面,給了幾條SQL,問需要執(zhí)行幾次樹搜索操作?

九、 面試官考點(diǎn)之大表添加索引

「面試官:」 如果一張表數(shù)據(jù)量級(jí)是千萬級(jí)別以上的,那么,給這張表添加索引,你需要怎么做呢?

「解析:」 我們需要知道一點(diǎn),給表添加索引的時(shí)候,是會(huì)對(duì)表加鎖的。如果不謹(jǐn)慎操作,有可能出現(xiàn)生產(chǎn)事故的??梢詤⒖家韵路椒ǎ?/span>

  • 1.先創(chuàng)建一張跟原表A數(shù)據(jù)結(jié)構(gòu)相同的新表B。
  • 2.在新表B添加需要加上的新索引。
  • 3.把原表A數(shù)據(jù)導(dǎo)到新表B
  • 4.rename新表B為原表的表名A,原表A換別的表名;

總結(jié)

本文主要講解了索引的9大關(guān)鍵面試考點(diǎn),希望對(duì)大家有幫助。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉