在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?
上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。
1、主鍵索引
主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只能有乙個主鍵,並且主鍵值不能包含null。
在mysql中,innodb資料表的主鍵設計我們通常遵循幾個原則:
1、採用乙個沒有業務用途的自增屬性列作為主鍵;
2、主鍵字段值總是不更新,只有新增或者刪除兩種操作;
3、不選擇會動態更新的型別,比如當前時間戳等。
這麼做的好處有幾點:
1、新增資料時,由於主鍵值是順序增長的,innodb page發生**的概率降低了;可以參考以往的分享「[mysql faq]系列 — 為什麼innodb表要建議用自增列做主鍵」;
2、業務資料有變更時,不修改主鍵值,物理儲存位置發生變化的概率降低了,innodb page中產生碎片的概率也降低了。
myisam表因為是堆組織表,主鍵型別設計方面就可以不用這麼講究了。
2、輔助索引
輔助索引,就是我們常規所指的索引,原文是secondary key。輔助索引裡還可以再分為唯一索引,非唯一索引。
唯一索引其實應該叫做唯一性約束,它的作用是避免一列或多列值存在重複,是一種約束性索引。
3、主鍵索引和輔助索引的區別
在myisam引擎中,唯一索引除了key值允許存在null外,其餘的和主鍵索引沒有本質性區別。也就是說,在myisam引擎中,不允許存在null值的唯一索引,本質上和主鍵索引是一回事。
而在innodb引擎中,主鍵索引和輔助索引的區別就很大了。主鍵索引會被選中作為聚集索引,而唯一索引和普通輔助索引間除了唯一性約束外,在儲存上沒本質區別。
從查詢效能上來說,在myisam表中主鍵索引和不允許有null的唯一索引的查詢效能是相當的,在innodb表通過唯一索引查詢則需要多一次從輔助索引到主鍵索引的轉換過程。innodb表基於普通索引的查詢代價更高,因為每次檢索到結果後,還需要至少再多檢索一次才能確認是否還有更多符合條件的結果,主鍵索引和唯一索引就不需要這麼做了。
經過測試,對100萬行資料的myisam做隨機檢索(整數型別),主鍵和唯一索引的效率基本一樣,普通索引的檢索效率則慢了30%以上。換成innodb表的話,唯一索引比主鍵索引效率約慢9%,普通索引比主鍵索引約慢了50%以上。
mysql主鍵是聚集索引麼 主鍵就是聚集索引嗎?
前言 最近在一次面試中,討論了乙個這樣的問題 主鍵和索引有什麼區別?當時我的回答是這樣的 主鍵就是加了唯一性約束的聚集索引。你確定你所說的是對的?面試官反問到。應該是對的。我不加思索地回答道。你回去後研究一下這個問題吧。難道我真的錯了?第一次嘗試 當問題出現時,請用事實支援你的觀點。首先,必須了解一...
mysql 主鍵 索引
mysql新增索引命令 1.primary key 主鍵索引 mysql alter tabletable nameadd primary key column 2.unique 唯一索引 mysql alter tabletable nameadd unique column 3.index 普通...
mysql 雜湊索引 MySQL索引之雜湊索引
雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...