一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

面試官考點之索引是什么?

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)分析與開發(fā) ? 作者:數(shù)據(jù)分析與開發(fā) ? 2021-03-05 10:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

有位朋友去阿里面試,他說面試官給了幾條查詢SQL,問:需要執(zhí)行幾次樹搜索操作?我朋友當時是有點懵的,后來冷靜思考,才發(fā)現(xiàn)就是考索引的幾個基礎(chǔ)知識點~~ 本文我們分九個索引知識點,一起來探討一下

一、面試官考點之索引是什么?

索引是一種能提高數(shù)據(jù)庫查詢效率的數(shù)據(jù)結(jié)構(gòu)。它可以比作一本字典的目錄,可以幫你快速找到對應(yīng)的記錄。

索引一般存儲在磁盤的文件中,它是占用物理空間的。

正所謂水能載舟,也能覆舟。適當?shù)乃饕芴岣卟樵冃?,過多的索引會影響數(shù)據(jù)庫表的插入和更新功能。

二、索引有哪些類型類型

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

B+樹索引:所有數(shù)據(jù)存儲在葉子節(jié)點,復(fù)雜度為O(logn),適合范圍查詢。

哈希索引: 適合等值查詢,檢索效率高,一次到位。

全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本類型char,text,varchar類型上創(chuàng)建。

R-Tree索引: 用來對GIS數(shù)據(jù)類型創(chuàng)建SPATIAL索引

物理存儲維度

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

非聚集索引:非聚集索引就是以非主鍵創(chuàng)建的索引,在葉子節(jié)點存儲的是主鍵和索引列。

邏輯維度

主鍵索引:一種特殊的唯一索引,不允許有空值。

普通索引:MySQL中基本索引類型,允許空值和重復(fù)值。

聯(lián)合索引:多個字段創(chuàng)建的索引,使用時遵循最左前綴原則。

唯一索引:索引列中的值必須是唯一的,但是允許為空值。

空間索引:MySQL5.7之后支持空間索引,在空間索引這方面遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則。

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

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

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

select*fromemployeewhereagebetween18and28;

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

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

為什么不使用二叉樹呢?

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

每個結(jié)點最多兩個子樹,分別稱為左子樹和右子樹。

左子節(jié)點的值小于當前節(jié)點的值,當前節(jié)點值小于右子節(jié)點值

頂端的節(jié)點稱為跟節(jié)點,沒有子節(jié)點的節(jié)點值稱為葉子節(jié)點。

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

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

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

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

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

但是呢:

平衡二叉樹插入或者更新是,需要左旋右旋維持平衡,維護代價大

如果數(shù)量多的話,樹的高度會很高。因為數(shù)據(jù)是存在磁盤的,以它作為索引結(jié)構(gòu),每次從磁盤讀取一個節(jié)點,操作IO的次數(shù)就多啦。

為什么不使用B樹呢?

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

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

B+樹非葉子節(jié)點上是不存儲數(shù)據(jù)的,僅存儲鍵值,而B樹節(jié)點中不僅存儲鍵值,也會存儲數(shù)據(jù)。innodb中頁的默認大小是16KB,如果不存儲數(shù)據(jù),那么就會存儲更多的鍵值,相應(yīng)的樹的階數(shù)(節(jié)點的子節(jié)點樹)就會更大,樹就會更矮更胖,如此一來我們查找數(shù)據(jù)進行磁盤的IO次數(shù)有會再次減少,數(shù)據(jù)查詢的效率也會更快。

B+樹索引的所有數(shù)據(jù)均存儲在葉子節(jié)點,而且數(shù)據(jù)是按照順序排列的,鏈表連著的。那么B+樹使得范圍查找,排序查找,分組查找以及去重查找變得異常簡單。

四、面試官考點之一次B+樹索引搜索過程

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

CREATETABLE`employee`( `id`int(11)NOTNULL, `name`varchar(255)DEFAULTNULL, `age`int(11)DEFAULTNULL, `date`datetimeDEFAULTNULL, `sex`int(1)DEFAULTNULL, PRIMARYKEY(`id`), KEY`idx_age`(`age`)USINGBTREE )ENGINE=InnoDBDEFAULTCHARSET=utf8; insertintoemployeevalues(100,'小倫',43,'2021-01-20','0'); insertintoemployeevalues(200,'俊杰',48,'2021-01-21','0'); insertintoemployeevalues(300,'紫琪',36,'2020-01-21','1'); insertintoemployeevalues(400,'立紅',32,'2020-01-21','0'); insertintoemployeevalues(500,'易迅',37,'2020-01-21','1'); insertintoemployeevalues(600,'小軍',49,'2021-01-21','0'); insertintoemployeevalues(700,'小燕',28,'2021-01-21','1');

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

select*fromTemployeewhereage=32;

解析:其實這個,面試官就是考察候選人是否熟悉B+樹索引結(jié)構(gòu)圖。可以像醬紫回答~

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

77259210-7b71-11eb-8b86-12bb97331649.png

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

775005d6-7b71-11eb-8b86-12bb97331649.png

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

搜索idx_age索引樹,將磁盤塊1加載到內(nèi)存,由于32<37,搜索左路分支,到磁盤尋址磁盤塊2。

將磁盤塊2加載到內(nèi)存中,在內(nèi)存繼續(xù)遍歷,找到age=32的記錄,取得id = 400.

拿到id=400后,回到id主鍵索引樹。

搜索id主鍵索引樹,將磁盤塊1加載內(nèi)存,在內(nèi)存遍歷,找到了400,但是B+樹索引非葉子節(jié)點是不保存數(shù)據(jù)的。索引會繼續(xù)搜索400的右分支,到磁盤尋址磁盤塊3.

將磁盤塊3加載內(nèi)存,在內(nèi)存遍歷,找到id=400的記錄,拿到R4這一行的數(shù)據(jù),好的,大功告成。

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

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

五、面試官考點之覆蓋索引

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

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

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

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

六、面試官考點之索引失效

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

select*fromemployeewherenamelike'%杰倫%';

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

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

查詢條件包含or,可能導(dǎo)致索引失效

如何字段類型是字符串,where時一定用引號括起來,否則索引失效

like通配符可能導(dǎo)致索引失效。

聯(lián)合索引,查詢時的條件列不是聯(lián)合索引中的第一個列,索引失效。

在索引列上使用mysql的內(nèi)置函數(shù),索引失效。

對索引列運算(如,+、-、*、/),索引失效。

索引字段上使用(!= 或者 < >,not in)時,可能會導(dǎo)致索引失效。

索引字段上使用is null, is not null,可能導(dǎo)致索引失效。

左連接查詢或者右連接查詢查詢關(guān)聯(lián)的字段編碼格式不一樣,可能導(dǎo)致索引失效。

mysql估計使用全表掃描要比使用索引快,則不使用索引。

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

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

select*fromemployeewherenamelike'小%'orderbyagedesc;

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

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

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

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

最左前綴也可以是字符串索引的最左M個字符。

八、面試官考點之索引下推

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

select*fromemployeewherenamelike'小%'andage=28andsex='0';

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

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

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

九、 面試官考點之大表添加索引

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

解析:我們需要知道一點,給表添加索引的時候,是會對表加鎖的。如果不謹慎操作,有可能出現(xiàn)生產(chǎn)事故的。可以參考以下方法:

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)鍵知識點,希望對大家有幫助。接下來呢,給大家出一道,有關(guān)于我最近業(yè)務(wù)開發(fā)遇到的加索引SQL,看下大家是怎么回答的,題目如下:

select*fromAwheretype='1'andstatus='s'orderbycreate_timedesc;

假設(shè)type有9種類型,區(qū)分度性還算可以,status的區(qū)分度不高(有3種類型),那么你是如何加索引呢?

是給type加單索引

還是(type,status,create_time)聯(lián)合索引

還是(type,create_time)聯(lián)合索引呢?

責任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    783

    瀏覽量

    45140
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12637
  • 索引
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10657

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

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    軟通動力出席華為開發(fā)者大會2025

    華為開發(fā)者大會 2025中,軟通動力展出“鴻蒙電腦+AI:AI面試官”以及多款HarmonyOS Connect產(chǎn)品,并受邀在多個專題分論分享鴻蒙生態(tài)領(lǐng)域技術(shù)與解決方案能力。
    的頭像 發(fā)表于 07-01 09:07 ?393次閱讀

    廣凌國家教育考試標準化考點建設(shè)方案解析

    廣凌科技(廣凌股份)深耕教育信息化領(lǐng)域27年,其國家教育考試標準化考點建設(shè)方案以“技術(shù)守護教育公平”為核心使命,深度融合AI、5G、物聯(lián)網(wǎng)等前沿技術(shù),構(gòu)建了覆蓋全流程、全場景的智能化考場管理體系。廣凌的國家教育考試標準化考點建設(shè)方案哪有那些特別的地方呢?一起來了解一下吧~
    的頭像 發(fā)表于 06-25 17:46 ?176次閱讀
    廣凌國家教育考試標準化<b class='flag-5'>考點</b>建設(shè)方案解析

    廣凌創(chuàng)新解決方案:高校標準化考點建設(shè)

    隨著教育信息化的快速發(fā)展,國家對考試公平性和安全性的要求日益提高。標準化考點建設(shè)已成為高校教育管理的重要課題,其核心在于通過技術(shù)手段構(gòu)建高效、智能、安全的考試環(huán)境。然而,許多高校在實施過程中仍面臨
    的頭像 發(fā)表于 06-05 09:16 ?284次閱讀
    廣凌創(chuàng)新解決方案:高校標準化<b class='flag-5'>考點</b>建設(shè)

    請問改變電源管理芯片參考點電壓就會改變芯片輸出電壓的原理是什么?

    R1電阻上電流為I1,參考點輸出電流為I2,則根據(jù)電路定理,輸出電壓Uo=15+I1*R2+I2*R2,如果I2*R2這一項比較小的話,輸出電壓就是前面那一個關(guān)系式Uo=(1+R2/R1)*Ue; 不明白的一點是,為什么把這一個參考點的電位抬高,輸出電壓就會增大,其內(nèi)部結(jié)
    發(fā)表于 04-17 06:28

    硬件面試(一)

    硬件面試(一)
    的頭像 發(fā)表于 02-26 13:55 ?670次閱讀
    硬件<b class='flag-5'>面試</b>(一)

    面試題】人工智能工程師高頻面試題匯總:概率論與統(tǒng)計篇(題目+答案)

    ?隨著人工智能技術(shù)的突飛猛進,AI工程師成為了眾多求職者夢寐以求的職業(yè)。想要拿下這份工作,面試的時候得展示出你不僅技術(shù)過硬,還得能解決問題。所以,提前準備一些面試常問的問題,比如概率論與統(tǒng)計知識
    的頭像 發(fā)表于 01-22 13:00 ?936次閱讀
    【<b class='flag-5'>面試</b>題】人工智能工程師高頻<b class='flag-5'>面試</b>題匯總:概率論與統(tǒng)計篇(題目+答案)

    創(chuàng)建唯一索引的SQL命令和技巧

    在創(chuàng)建唯一索引時,以下是一些SQL命令和技巧,可以幫助優(yōu)化性能: 使用合適的索引類型:對于需要保證唯一性的列,使用UNIQUE索引來避免重復(fù)數(shù)據(jù)的插入。 這可以確保列中的值是唯一的,同時提高查詢效率
    的頭像 發(fā)表于 01-09 15:21 ?511次閱讀

    面試題】人工智能工程師高頻面試題匯總:機器學習深化篇(題目+答案)

    隨著人工智能技術(shù)的突飛猛進,AI工程師成為了眾多求職者夢寐以求的職業(yè)。想要拿下這份工作,面試的時候得展示出你不僅技術(shù)過硬,還得能解決問題。所以,提前準備一些面試常問的問題,比如機器學習的那些算法
    的頭像 發(fā)表于 12-16 13:42 ?2831次閱讀
    【<b class='flag-5'>面試</b>題】人工智能工程師高頻<b class='flag-5'>面試</b>題匯總:機器學習深化篇(題目+答案)

    面試題】人工智能工程師高頻面試題匯總:Transformer篇(題目+答案)

    隨著人工智能技術(shù)的突飛猛進,AI工程師成為了眾多求職者夢寐以求的職業(yè)。想要拿下這份工作,面試的時候得展示出你不僅技術(shù)過硬,還得能解決問題。所以,提前準備一些面試常問的問題,比如機器學習的那些算法
    的頭像 發(fā)表于 12-13 15:06 ?1380次閱讀
    【<b class='flag-5'>面試</b>題】人工智能工程師高頻<b class='flag-5'>面試</b>題匯總:Transformer篇(題目+答案)

    人工智能工程師高頻面試題匯總——機器學習篇

    隨著人工智能技術(shù)的突飛猛進,AI工程師成為了眾多求職者夢寐以求的職業(yè)。想要拿下這份工作,面試的時候得展示出你不僅技術(shù)過硬,還得能解決問題。所以,提前準備一些面試常問的問題,比如機器學習的那些算法
    的頭像 發(fā)表于 12-04 17:00 ?1539次閱讀
    人工智能工程師高頻<b class='flag-5'>面試</b>題匯總——機器學習篇

    面試嵌入式都會問那些問題呢?

    作為一名電子工程專業(yè)的畢業(yè)生,我對嵌入式系統(tǒng)開發(fā)一直充滿熱情。當我決定踏入這個行業(yè),尋找屬于自己的職業(yè)道路時,面試成為了我必須面對的挑戰(zhàn)。在這里,我想分享一些我在嵌入式系統(tǒng)面試中遇到的問題以及我的應(yīng)對經(jīng)驗。
    的頭像 發(fā)表于 11-27 09:13 ?741次閱讀
    <b class='flag-5'>面試</b>嵌入式都會問那些問題呢?

    程序員去面試只需一個技能征服所有面試官

    個車輛工程專業(yè)的研究生去面試,面試官最后問他會不會嵌入式。雖然應(yīng)聘的崗位不是嵌入式工程師,但看來老板還是希望他能懂點這方面的知識。這個小插曲就說明了一個重要的就業(yè)
    的頭像 發(fā)表于 11-05 19:35 ?555次閱讀
    程序員去<b class='flag-5'>面試</b>只需一個技能征服所有<b class='flag-5'>面試官</b>!

    MATLAB中的矩陣索引

    對矩陣進行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強大、靈活,而且可讀性強、表現(xiàn)力強。矩陣是 MATLAB 用來組織和分析數(shù)據(jù)的一個核心組件,索引是以可理解的方式有效操作矩陣的關(guān)鍵。
    的頭像 發(fā)表于 09-05 09:28 ?1085次閱讀
    MATLAB中的矩陣<b class='flag-5'>索引</b>

    請問LM358使用雙電源供電時,共模電壓的參考點是GND還是VEE呢?

    請問LM358使用雙電源供電時,1.對稱供電,共模電壓的參考點是GND還是VEE呢? 2.如果不對稱供電,但是正負電源絕對值一樣,那共模電壓還是一樣嗎?對輸出的影響會怎樣呢?
    發(fā)表于 08-05 07:27

    一文了解MySQL索引機制

    接觸MySQL數(shù)據(jù)庫的小伙伴一定避不開索引,索引的出現(xiàn)是為了提高數(shù)據(jù)查詢的效率,就像書的目錄一樣。 某一個SQL查詢比較慢,你第一時間想到的就是“給某個字段加個索引吧”,那么索引是什么
    的頭像 發(fā)表于 07-25 14:05 ?566次閱讀
    一文了解MySQL<b class='flag-5'>索引</b>機制