普通索引和惟一索引的思考

你們好,我是IT修真院深圳分院java第4期學員,一枚正直善良的java程序員。今天給你們分享一下,修真院官網java任務一中關於普通索引和惟一索引的區別,以及在任務中使用的一些感想。html

1.背景介紹java

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。 從數據搜索實現的角度來看,索引也是另一類文件/記錄,它包含着能夠指示出相關數據記錄的各類記錄。mysql

2.知識剖析git

在瞭解數據庫索引以前,首先了解一下數據庫索引的數據結構基礎:B+tree程序員

clipboard.png

說一下重點,淺藍色的塊咱們稱之爲一個磁盤塊,能夠看到每一個磁盤塊包含幾個數據項(深藍色所示)和指針(黃色所示)。如磁盤塊1包含數據項17和35,包含指針P一、P二、P3,P1表示小於17的磁盤塊,P2表示在17和35之間的磁盤塊,P3表示大於35的磁盤塊。真實的數據存在於葉子節點即三、五、九、十、1三、1五、2八、2九、3六、60、7五、7九、90、99。非葉子節點只不存儲真實的數據,只存儲指引搜索方向的數據項,如1七、35並不真實存在於數據表中。github

查詢時B+Tree究竟是怎麼運做的?簡單分析一下:sql

若是要查找數據項29,那麼首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找肯定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間由於很是短(相比磁盤的IO)能夠忽略不計,經過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,經過指針加載磁盤塊8到內存,發生第三次IO,同時內存中作二分查找找到29,結束查詢,總計三次IO。真實的狀況是,3層的b+Tree能夠表示上百萬的數據,若是上百萬的數據查找只須要三次IO,性能提升將是巨大的,若是沒有索引,每一個數據項都要發生一次IO,那麼總共須要百萬次的IO,顯然成本很是很是高。數據庫

B+Tree的性質:數據結構

1.n棵子tree的結點包含n個關鍵字,不用來保存數據而是保存數據的索引。性能

2.全部的葉子結點中包含了所有關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點自己依關鍵字的大小自小而大順序連接。

3.全部的非終端結點能夠當作是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。

索引分類:

mysql的索引分爲單列索引(主鍵索引,惟一索引,普通索引)和組合索引。

單列索引:一個索引只包含一個列,一個表能夠有多個單列索引。

組合索引:一個組合索引包含兩個或兩個以上的列。

普通索引,這個是最基本的索引。

惟一索引,與普通索引相似,可是不一樣的是惟一索引要求全部的類的值是惟一的,這一點和主鍵索引同樣,容許有空值。 創建惟一索引一個比較重要的做用是避免數據出現重複。

主鍵索引,不容許有空值。主鍵索引創建的規則是 int優於varchar,通常在建表的時候建立, 最好是與表的其餘字段不相關的列或者是業務不相關的列。通常會設爲 int 並且是 AUTO_INCREMENT自增類型的。

索引的優勢:

1.能夠經過創建惟一索引或者主鍵索引,保證數據庫表中每一行數據的惟一性

2.創建索引能夠大大提升檢索的數據,以及減小表的檢索行數

3.在錶鏈接的鏈接條件,能夠加速表與表直接的相連

4.在分組和排序字句進行數據檢索,能夠減小查詢時間中 分組 和 排序時所消耗的時間(數據庫的記錄會從新排序)

5.創建索引,在查詢中使用索引,能夠提升性能。

索引的缺點:

1.在建立索引和維護索引,會耗費時間,隨着數據量的增長而增長

2.索引文件會佔用物理空間,除了數據表須要佔用物理空間以外,每個索引還會佔用必定的物理空間

3.當對錶的數據進行 INSERT,UPDATE,DELETE 的時候,索引也要動態的維護,這樣就會下降數據的維護速度,(創建索引會佔用磁盤空間的索引文件)。

關於索引的優缺點你們結合B+Tree很容易就理解了。

3.常見問題

1:如何建立索引?

2:隱式類型轉換對MySQL選擇索引的影響?

3:什麼狀況下建索引?

4.什麼狀況不建索引?

5:索引對提升查詢速度能提高多少性能?

4.解決方案

sql插入索引語句:

普通索引:ALTER TABLE table_name ADD INDEX index_name ( column )

惟一索引:ALTER TABLE table_name ADD UNIQUE ( column )

主鍵索引:ALTER TABLE table_name ADD PRIMARY KEY ( column )

當文本字段與數字進行比較時,因爲類型不一樣,MySQL 須要作隱式類型轉換才能進行比較。

默認轉換規則是:

不一樣類型全都轉換爲浮點型

若是字段是字符,條件是整型,那麼會把表中字段全都轉換爲整型

什麼狀況下要創建索引:

1.在常常須要搜索的列上,能夠加快索引的速度。

2.主鍵列上能夠確保列的惟一性。

3.在表與表的而鏈接條件上加上索引,能夠加快鏈接查詢的速度。

4.在常常須要排序(order by),分組(group by)和的distinct 列上加索引 能夠加快排序查詢的時間,   (單獨order by 用不了索引,索引考慮加where 或加limit)。

5.儘可能選擇區分度高的列做爲索引。

6.索引列不能參與計算,保持列「乾淨」。

7.儘可能的擴展索引,不要新建索引

什麼狀況下不創建索引:

1.查詢中不多使用到的列 不該該建立索引,若是創建了索引然而還會下降mysql的性能和增大了空間需求。

2.不多數據的列也不該該創建索引,好比 一個性別字段 0或者1,在查詢中,結果集的數據佔了表中數據行 的比例比較大,mysql須要掃描的行數不少,增長索引,並不能提升效率。

3.定義爲text和image和bit數據類型的列不該該增長索引。

4.當表的修改(UPDATE,INSERT,DELETE)操做遠遠大於檢索(SELECT)操做時不該該建立索引,這兩個操做是互斥的關係。

5.編碼實戰

6.擴展思考

若是對學員QQ號作了一個惟一索引,在插入數據的時候,是否須要先判斷這個QQ號已經存在了?

若是qq號作了惟一索引,咱們插入時會提示咱們重複插入,阻止咱們插入。可是要是在現實業務中,咱們須要把這個反饋給客戶端,因此咱們是須要作一個判斷,若是qq號重複就把這個信息反饋給客戶端。

7.參考文獻

參考一:MySQL索引原理及慢查詢優化

參考二:類型轉換對MySQL選擇索引的影響

參考三:MySQL8.0參考手冊

8.更多討論

PPT連接:戳這裏

騰訊視頻:戳這裏

今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚~

相關文章
相關標籤/搜索