你們好,我是IT修真院深圳分院java第4期學員,一枚正直善良的java程序員。今天給你們分享一下,修真院官網java任務一中關於普通索引和惟一索引的區別,以及在任務中使用的一些感想。html
1.背景介紹java
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。 從數據搜索實現的角度來看,索引也是另一類文件/記錄,它包含着能夠指示出相關數據記錄的各類記錄。mysql
2.知識剖析git
在瞭解數據庫索引以前,首先了解一下數據庫索引的數據結構基礎:B+tree程序員
說一下重點,淺藍色的塊咱們稱之爲一個磁盤塊,能夠看到每一個磁盤塊包含幾個數據項(深藍色所示)和指針(黃色所示)。如磁盤塊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索引原理及慢查詢優化
參考三:MySQL8.0參考手冊
8.更多討論
PPT連接:戳這裏
騰訊視頻:戳這裏
今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚~