學點關於索引的知識

2021-10-23 21:07:47 字數 4397 閱讀 5170

首先是從面試題切入吧,比較常問但不複雜.(摘抄)

q:你們每天這麼大的資料量,都是儲存在關係型資料庫中嗎?

a:是的,我們線上使用的是mysql資料庫

q:每天幾百萬資料,乙個月就是幾千萬了,那你們有沒有對於查詢做一些優化呢?

a:我們在資料庫中建立了一些索引(我現在非常後悔我當時說了這句話)

q:那你能說說什麼是索引嗎?

a:(這道題肯定難不住我啊)索引其實是一種資料結構,能夠幫助我們快速的檢索資料庫中的資料

q:那麼索引具體採用的哪種資料結構呢?

a:(這道題我也背過)常見的mysql主要有兩種結構:hash索引和b+ tree索引,我們使用的是innodb引擎,預設的是b+樹

q:既然你提到innodb使用的b+ 樹的索引模型,那麼你知道為什麼採用b+ 樹嗎?這和hash索引比較起來有什麼優缺點嗎?

q:剛剛我們聊到b+ tree ,那你知道b+ tree的葉子節點都可以存哪些東西嗎?

a:innodb的b+ tree可能儲存的是整行資料,也有可能是主鍵的值

q:那這兩者有什麼區別嗎?

a:(當他問我葉子節點的時候,其實我就猜到他可能要問我聚簇索引和非聚簇索引了)在 innodb 裡,索引b+ tree的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引b+ tree的葉子節點儲存了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引

q:那麼,聚簇索引和非聚簇索引,在查詢資料的時候有區別嗎?

a:聚簇索引查詢會更快?

q:為什麼呢?

a:因為主鍵索引樹的葉子節點直接就是我們要查詢的整行資料了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以後,還需要再通過主鍵的值再進行一次查詢

q:剛剛你提到主鍵索引查詢只會查一次,而非主鍵索引需要回表查詢多次。(後來我才知道,原來這個過程叫做回表)是所有情況都是這樣的嗎?非主鍵索引一定會查詢多次嗎?

a:(額、這個問題我回答的不好,後來我自己查資料才知道,通過覆蓋索引也可以只查詢一次)

q:不知道的話沒關係,想問一下,你們在建立索引的時候都會考慮哪些因素呢?

a:我們一般對於查詢概率比較高,經常作為where條件的字段設定索引

q: 那你們有用過聯合索引嗎?

a:用過呀,我們有對一些表中建立過聯合索引

q:那你們在建立聯合索引的時候,需要做聯合索引多個字段之間順序你們是如何選擇的呢?

a:我們把識別度最高的字段放到最前面

q: 那你知道最左字首匹配嗎?

a:(我突然想起來原來面試官是想問這個,怪自己剛剛為什麼就沒想到這個呢。)哦哦哦。您剛剛問的是這個意思啊,在建立多列索引時,我們根據業務需求,where子句中使用最頻繁的一列放在最左邊,因為mysql索引查詢會遵循最左字首匹配的原則,即最左優先,在檢索資料時從聯合索引的最左邊開始匹配。所以當我們建立乙個聯合索引的時候,如(key1,key2,key3),相當於建立了(key1)、(key1,key2)和(key1,key2,key3)三個索引,這就是最左匹配原則

這位兄嘚面試 我覺得比較能體現當時的情景,同時 從面試上也能看出來,面試難度從小到大,從基礎開始迴圈漸進,(我個人只看面試題就能理解個大概了)

1.提高查詢速度

2.確保資料的唯一性

3.加速表與表之間的連線性

4.使用分組和排序檢索資料時,減少分組和排序的時間

5.全文檢索搜尋優化

1.普通索引: 基本的索引型別,,沒有唯一性的限制。

刪除索引: drop index [indexname] on 『表』

建立索引: create index [indexname] on 『表』(username)

2.唯一索引: 作用是避免表中某列值不重複,與普通索引類似,值可以為空,不同的是,索引列的值必須是唯一,可以有多個

建立索引 create unique index indexname on mytable

(username

(length)

) 修改表結構 alter mytable add unique [indexname] on (

username

(length)

) 建立表的時候直接指定 create table mytable

( id int not null, username varchar(16

) not null, unique [indexname]

(username

(length)

))

3.主鍵索引: 不允許有空值,特殊的唯一索引,在建表的同時建立,(感覺就像是主鍵)

建立索引 create table mytable

( id int not null, username varchar(16

) not null, primary key

(id)

)當然也可以用 alter 命令。

記住:乙個表只能有乙個主鍵。

4.組合索引::為了形象地對比單列索引和組合索引,為表新增多個字段:

建立索引 create table mytable

( id int not null, username varchar(16

) not null, city varchar(50

) not null, age int not null )

為了進一步榨取mysql的效率,就要考慮建立組合索引。

就是將 name, city, age建到乙個索引裡:

alter table mytable add index username_city_age (

username(10

),city,age)

建表時,username長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。

如果分別在 username,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。

雖然此時有了三個索引,但mysql只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了下面三組組合mysql資料庫索引:

username,city,age

username,city

username,age

為什麼沒有 city,age這樣的組合索引呢?

這是因為mysql組合索引「最左字首」的結果

比如:這個就會用到:

select * from mytable whree username=

"admin"

這個就不會:

select * from mytable whree age=

"20"

首先 ,mysql5.5以上預設的儲存引擎是innodb,只顯示支援b+樹索引,頻繁訪問的表,innodb會自適應建立hash索引,這個hash索引是建立在b+樹上,方便查詢快,使用者無法自己指定.

二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。二叉樹有如下特性:

1、每個結點都包含乙個元素以及n個子樹,這裡0≤n≤2。

2、左子樹和右子樹是有順序的,次序不能任意顛倒。左子樹的值要小於父結點,右子樹的值要大於父結點。

平衡二叉樹是一種特殊的二叉樹,所以他也滿足前面說到的二叉樹的兩個特性,同時還有乙個特性:

它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

至於b-樹和b+樹請移步

(太多了 ,第一次看能看懂80%)

上面這個樹的詳解

(這個事避開了詳解 ,點中要害,語言簡短精煉的那種)

其實研究下來 ,東西沒有很複雜 但是量多,比較吃資料結構和空間想象力(我是這麼認為,實在不行 拿紙拿筆畫一畫)

要經常提醒自己回過頭看看,很容易忘

每天學點前端知識 關於MEAN

2015 04 13 1.說在前面 開始接觸前端還是老師給的乙個只有 樣式的框架,到現在樂於在網路上搜尋自己感興趣的資訊,每看到乙個自己之前不知道的就會隨手給自己科普一下,然後一段時間過後就會忘記,為了讓自己能夠有自己的知識體系,形成自己的知識樹,so,最終決定還是寫下自己的成長歷程,說不定什麼時候...

學點HTTP知識

又一次感覺到不學無術,被人一問http知識盡然一點也沒答上來,丟人丟到家了啊。平時也看許多的技術文章,為什麼到了關鍵時刻就答不上來呢?確實發現乙個問題,光看是沒有用的,需要實踐。看別人說的頭頭是道自己也覺得理解了,但發現再讓自己複述一遍可能完全就答不上來。這就是因為看別人的文章更像看 腦子裡跟著作者...

學點資料運營的知識

任何一種商業模式,都不能缺少使用者 產品 運營這三種基本的元素 任何乙個產品,都需要配合好的運營體系才能發揮出它對使用者的價值。而所謂的資料運營,就是通過資料來建立產品與使用者之間的關係,資料是最核心的干預手段。很多人想到運營,就把這個崗位與市場啊 策劃啊等等聯絡起來,要求有創意 能拉通 懂業務 如...