唯一索引和普通索引的區別
一、背景介紹
索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執行查詢時Mysql必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄,表裡面的記錄數量越多,這個操作的代價就越高,如果作為搜尋條件的列上已經建立了索引,mysql無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有一千個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍。所以對於現在的各種大型資料庫來說,索引可以大大提高資料庫的效能,以至於它變成了資料庫不可缺少的一部分。
二.知識剖析
1.MySQL都有哪些索引型別呢?
mysql提供多種索引型別供選擇:普通索引,唯一索引,主鍵
全文索引,單列索引,與多列索引
2.普通索引
普通索引的唯一任務是加快對資料的訪問速度,因此,應該只為那些最經常出現在查詢條件(WHERE column=)或者排序條件(ORDERBY column)中的資料列建立索引
3.主鍵
必須為主鍵欄位建立一個索引,這個Mysql索引就是所謂的“主索引”。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE
4.唯一性索引
如果確定某個資料列只包含彼此各不相同的值,在為這個資料列建立索引的時候,就應該用關鍵字UNIQUE把它定義為一個唯一索引,Mysql會在有新紀錄插入資料表時,自動檢查新紀錄的這個欄位的值是否已經在某個記錄的這個欄位裡出現過了。如果是,mysql將拒絕插入那條新紀錄。也就是說,唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複
5.索引的優點
5.1.可以通過建立唯一索引或者主鍵索引,保證資料庫表中每一行資料的唯一性
5.2.建立索引可以大大提高檢索的資料,以及減少表的檢索行數
5.3.在表連線的連線條件,可以加速表與表直接的相連
5.4.在分組和排序字句進行資料檢索,可以減少查詢時間中分組和排序時所消耗的時間(資料庫的記錄會重新排序)
5.5.建立索引,在查詢中使用索引,可以提高效能。
6.索引的缺點
6.1.建立索引和維護索引,會耗費時間,隨著資料量的增加而增加
6.2.索引檔案會佔用物理空間,除了資料表需要佔用物理空間之外,每一個索引還會佔用一定的物理空間
6.3.當對錶的資料進行INSERT,UPDATE,DELETE的時候,索引也要動態的維護,這樣就會降低資料的維護速度,(建立索引會佔用磁碟空間的索引檔案)。
三.常見問題
1.如何建立索引
2.隱式型別轉換對MySQL選擇索引的影響。
3.什麼情況下建索引。
4.什麼情況不建索引。
5.索引對查詢提高多少效能?
四.解決方案
1.SQL插入索引語句。
1.1普通索引:ALTER TABLE'table-name' ADD INDEX index_name('column')
1.2唯一索引:ALTER TABLE'table-name' ADD UNIQUE('column')
1.3主鍵索引:ALTER TABLE'table-name' ADD PRIMARY KEY ('column')
2.當文字欄位與數字進行比較時,由於型別不同,MySQL需要做隱式型別轉換才能進行比較。
預設轉換規則是:不同型別全都轉換為浮點型m,如果欄位是字元,條件是整型,那麼會把表中欄位全都轉換成整型
3.1.在經常需要搜尋的列上,可以加快索引的速度
3.2主鍵列上可以確保列的唯一性(手機號,身份證號,銀行卡號)。
3.3在表與表的而連線條件上,加上索引,可以加快連線查詢的速度。
3.4.在經常需要排序(order by)分組(group by)和distinct列上加索引可以加快排序查詢的時間,(單獨order by用不了索引,索引考慮加where或者加limit)
3.5.儘量選擇區分度高的列作為索引。
3.6.索引列不能參與計算,保持列“乾淨”。
3.7.儘量的擴充套件索引,不要新建索引。
4.1.查詢中很少使用到的列,不應該建立索引,如果建立了索引然而還會降低mysql的效能和增大了空間需求。。
4.2很少資料的列也不應該建立索引,比如一個性別字段0或者1,在查詢中,結果集的資料佔了表中資料行的比例比較大,mysql需要掃描的行數很多,增加索引,並不能提高效率。
4.3定義為text和image和bit資料型別的列不應該增加索引。
4.4.當表的修改(UPDATE,INSERT,DELETE)操作遠遠大於檢索(SELECT)操作時不應該建立索引,這兩個操作時互斥的關係。
5.見執行編碼效果
五。編碼實戰
七、參考文獻
百度,書籍
八.更多討論
1.MySQL索引方法有幾種?
答:MySQL目前主要有以下幾種索引方法:B-Tree,Hash,R-Tree。
2.B-Tree和Hash的區別是什麼?
答: 1、B-Tree
B-Tree是最常見的索引型別,所有值(被索引的列)都是排過序的,每個葉節點到跟節點距離相等。所以B-Tree適合用來查詢某一範圍內的資料,而且可以直接支援資料排序(ORDER BY)
B-Tree在MyISAM裡的形式和Innodb稍有不同:
MyISAM表資料檔案和索引檔案是分離的,索引檔案僅儲存資料記錄的磁碟地址
InnoDB表資料檔案本身就是主索引,葉節點data域儲存了完整的資料記錄
2、Hash索引
2.1.僅支援"=","IN"和"<=>"精確查詢,不能使用範圍查詢:
由於Hash索引比較的是進行Hash運算之後的Hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的Hash演算法處理之後的Hash
2.2.不支援排序:
由於Hash索引中存放的是經過Hash計算之後的Hash值,而且Hash值的大小關係並不一定和Hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算
2.3.在任何時候都不能避免表掃描:
由於Hash索引比較的是進行Hash運算之後的Hash值,所以即使取滿足某個Hash鍵值的資料的記錄條數,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果
2.4.檢索效率高,索引的檢索可以一次定位,不像B-Tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以Hash索引的查詢效率要遠高於B-Tree索引
2.5.只有Memory引擎支援顯式的Hash索引,但是它的Hash是nonunique的,衝突太多時也會影響查詢效能。Memory引擎預設的索引型別即是Hash索引,雖然它也支援B-Tree索引
3.為什麼索引型別不一樣,但不同型別的索引方式還是B-Tree和Hash呢?
百度找不到答案,師兄們也不知道,咋整?暫時存疑。
4.不通過SQL語句,在java裡面怎麼建立索引?
用兩個Map搞定
Map wenjname=new HashMap();///索引是數字,內容是檔名
Map dcjc=new HashMap();///索引是單詞,內容是上面的索引
一個Map的話,也可以但是我覺得很費資源啊
作者:素履之往_3e36
連結:https://www.jianshu.com/p/dd4fe101cffe
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。