MYSQL面試 索引(四)

2021-08-28 08:11:28 字數 2868 閱讀 8142

-- 7.索引

-- 資料2: -- 索引sql語法

-- 資料3: -- 索引、explain分析

-- 資料4: -- 聚集索引和非聚集索引及優化

-- 資料5: -- using filesore優化索引案例

-- 索引的使用場景:

-- 對於非常'小'的表、大部分情況下簡單的全表掃瞄比建立索引更高效(不適用索引)

-- 對於'中到大型'的表,索引就非常有效(適用索引)

-- 但是對於'特大型'的表,建立和維護索引的代價將會隨之增長。這種情況下,需要用到一種技術可以直接區分出需要查詢的一組資料,而不是一條記錄一條記錄地匹配,例如可以使用'分割槽技術'(不適用索引)

-- 索引分類

-- 儲存結構:

-- b-tree索引(mysql使用b+tree):​b-tree能加快資料的訪問速度,因為儲存引擎不再需要進行全表掃瞄來獲取資料,資料分布在各個節點之中

-- b+tree索引:是b-tree的改進版本,同時也是資料庫索引索引所採用的儲存結構。資料都在葉子節點上,並且增加了順序訪問指標,每個葉子節點都指向相鄰的葉子節點的位址。相比b-tree來說,進行範圍查詢時只需要查詢兩個節點,進行遍歷即可。而b-tree需要獲取所有節點,相比之下b+tree效率更高

-- hash索引:對所有的索引列計算乙個雜湊碼(hash code),並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存指向每個資料行的指標

-- full-index全文索引

-- r-tree索引

-- 應用層次:

-- 普通索引:單列索引,乙個可以有多個(eg:id/name/age/***...)

-- 唯一索引:索引列值唯一,但允許空值(eg:id)

-- 復合索引:多列索引(eg:id+class)

-- 物理順序/邏輯順序:

-- 聚集索引:資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,乙個表中只能擁有乙個聚集索引

-- innodb的聚簇索引就是在同乙個結構儲存了b-tree(技術上說b+tree)和資料行

-- mysql裡主鍵就是聚集索引

-- 最好在建立表的生活建聚集索引,由於聚集索引的物理順序上的特殊性,因此如果再在上面建立索引的時候會根據索引列的排序移動全部資料行上面的順序,會非常地耗費時間以及效能

-- 非聚集索引:不是聚集索引就是非聚集索引

-- 非聚集索引葉節點仍然是索引節點,只是有乙個指標指向對應的資料塊,此如果使用非聚集索引查詢,而查詢列中包含了其他該索引沒有覆蓋的列,那麼他還要進行第二次的查詢,查詢節點上對應的資料行的資料。

-- 結論:mysql預設儲存引擎innodb只顯式支援b-tree( 從技術上來說是b+tree)索引,對於頻繁訪問的表,innodb會透明建立自適應hash索引,即在b樹索引基礎上建立hash索引,可以顯著提高查詢效率,對於客戶端是透明的,不可控制的,隱式的。

-- 索引的特點

-- 可以加快資料庫檢索速度

-- 降低資料庫插入修改刪除的速度

-- 只能建立在表上,不能建立到檢視上

-- 使用查詢處理器執行sql語句,在乙個表上,一次只能使用乙個索引

-- 索引優點

-- 建立唯一性索引,保證資料庫表中每一行資料的唯一性

-- 大大加快資料的檢索速度,這是建立索引的最主要的原因

-- 加速資料庫表之間的連線,特別是在實現資料的參考完整性方面特別有意義

-- 在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間

-- 索引缺點

-- 索引需要占用物理空間,除了資料表占用資料空間之外,每乙個索引還要佔一定的物理空間,如果建立聚簇索引,那麼需要的空間就會更大

-- 當對表中的資料進行增加、刪除和修改的時候,索引也需要維護,降低資料維護的速度

-- (面試)為什麼索引結構預設使用b-tree,而不是hash,二叉樹,紅黑樹?

-- 1.hash:雖然可以快速定位,但是沒有順序,io複雜度高。

-- 2.二叉樹:樹的高度不均勻,不能自平衡,查詢效率跟資料有關(樹的高度),並且io代價高。

-- 3.紅黑樹:樹的高度隨著資料量增加而增加,io代價高。

-- (面試)為什麼官方建議使用自增長主鍵作為索引?

-- 結合b+tree的特點,自增主鍵是連續的,在插入過程中儘量減少頁**,即使要進行頁**,也只會**很少一部分。並且能減少資料的移動,每次插入都是插入到最後。總之就是減少**和移動的頻率

-- (面試)索引失效的情況/那些情況不會使用索引?

-- (面試)那些情況適合建立索引?

-- 例子1:建立索引

create index c1 on demo(name);-- 給'name'建立索引(create)

alter table demo add index c2(password); -- 給'password'建立索引(alter)

create index c3 on demo(name,password); -- 建立聯合索引

alter table demo add primary key(id);-- 建立主鍵/聚集索引

alter table demo add constraint pk_id primary key(id);

drop index c3 on demo;-- 刪除索引

alter table demo drop primary key;-- 刪除primary索引

show index from demo;-- 檢視索引

-- 例子2:explain檢視sql效率

explain select * from demo;

explain select id,name,password from demo where id = 1;

mysql索引面試

1 索引概念 索引模型 我們是怎麼聊到索引的呢,是因為我提到我們的業務量比較大,每天大概有幾百萬的新資料生成,於是有了以下對話 q 你們每天這麼大的資料量,都是儲存在關係型資料庫中嗎?a 是的,我們線上使用的是mysql資料庫 q 每天幾百萬資料,乙個月就是幾千萬了,那你們有沒有對於查詢做一些優化呢...

面試整理 mysql索引

mysql索引分成以下幾類 b 索引 hash索引 全文索引 b 樹索引分為聚集索引和非聚集索引 輔助索引 聚集索引是通過表的主鍵來構建b 樹,聚集索引不僅包括索引的值還包括其他列的相關資訊。聚集索引中的記錄是根據鍵值順序存放的。聚集索引的非葉子節點儲存的是 健值,索引 對。位址為指向下一層的指標,...

Mysql面試總結 索引

1.資料庫中最常見的慢查詢優化方式是什麼 2.為什麼加索引能優化慢查詢 3.哪些資料結構能夠提高查詢速度 4.為什麼這些資料結構能優化查詢速度 mysql還要選擇b 樹 索引是幫助mysql高效獲取資料的資料結構 索引儲存在檔案系統中 索引的檔案儲存形式與儲存引擎相關 索引的結構 hash 二叉樹b...