前言
索引是mysql重要的一環,mysql可以大大的提高檢索的速度。
我們看看菜鳥教程對索引的比喻打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。
拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查詢到需要的字。
如果索引是按照拼音,筆畫,偏旁部首等排序的目錄快速找到需要的字,那沒有索引就相當於從前往後挨個找我們所需要的字。
我們經常使用的倉庫層條件查詢應該加入索引,但是索引不能無節制的加入。因為我們索引是通過犧牲空間去換取搜尋時間。索引在減少搜尋時間的同時,也會增加更新資料表的時間,對錶進行insert、update和delete操作的時候,不僅僅是對資料操作,還要去操作索引檔案。
但是,制約我們的永遠是我們的查詢速度,所以,索引對我們很有用處。
唯一索引
索引分四種。我們常用的有兩種,普通索引與唯一索引。
唯一索引顧名思義,就是通過某一查詢方法能查到唯一一條資料。
唯一索引經常被用於限制資料。舉個例子。現在有課程(course)和知識點(tag)兩個實體。知識點允許名稱相同,但是不允許有兩個相同名稱知識點關聯同一課程。也就是說,不存在兩個知識點課程id和名稱都相同。我們在資料庫如何保證呢,就需要用到我們的唯一索引。使用課程id與名稱name建立唯一索引。就可以避免這個問題。
jpa外來鍵索引
當我們通過jpa使用@manytoone,@onetomany等這些注釋去關聯外來鍵時,jpa會為我們自動注入外來鍵索引,就是通過我們繫結的字段去新增乙個普通索引。比如我們的標籤tag實體與course實體通過course_id關聯,我們在tag實體類加入/**
* 標籤屬於某門唯一的課程
@manytoone
@joincolumn(nullable = false)
private course course;
在執行專案時,jpa會自動為我們加入course_id普通索引。
jpa唯一索引
我們使用註解可以自定義索引,比如我們剛才唯一索引的例子,我們通過course_id和name兩個欄位去定義乙個唯一索引@table(uniqueconstraints = )})
jpa會為我們生成course_id與name唯一索引。
但是,出現了乙個問題。我們發現原來的 coruse_id普通索引消失了。這是為什麼呢?
猜測可能jpa索引為了避免生成大量索引,剛才我們也說了索引也有壞處,如果每個欄位都有索引就相當於都沒有索引。jpa在建立course_id與name唯一索引的同時,刪除了course_id普通索引,避免索引濫用。如果我們把唯一索引中的course_id變為其他字段,則不會刪除。
字段寫法
我們觀察一下,我們在寫course_id的時候是用的下橫線式的寫法。如果我們寫乙個普通的變數,比如deletedat欄位,則需要駝峰式的寫法,為什麼會有兩種寫法呢。
我們猜測,下橫線式寫法用於表示別的表的字段,因為我們course為關聯的表,而id為course表裡的字段,我們在表示別的表的字段的時候,使用下橫線式寫法,而在寫自己表中的字段的時候,用駝峰式寫法。我們猜測這麼做是為了防止字段衝突,在這裡是為了防止與乙個叫tag表中courseid欄位衝突,雖然實際中我們並沒有那個字段。
我們在實體中將name欄位加上@column註解,就像這樣@column(name = "test")
private string name;
此時我們不得不將我們寫的唯一註解中的name變為test。這是我們再猜測我們寫的語法其實是看的@column註解中name的值,且name預設為本欄位名。
總結當我們遇到乙個找不到原因的現象的時候,我們不妨站在規則制定者的角度去想問題,然後想乙個可以合理解釋的通的原因。可能這並不是最終正確原因,但是對於現階段的學習是正確的,我們不可能去學習jpa原始碼,成本是非常大的。我們想乙個合理的解釋可以適用於現階段的學習就可以了。未來我們可能會否定自己的答案去得到乙個更準確的答案。學習就是乙個不斷自我否定的過程,回想近幾百年的物理學發展,不也是這樣嗎。
感謝老師的指導。
索引,復合索引
這裡只看btree索引,至於雜湊索引和全文索引本文暫不討論。前言 索引是有效使用資料庫的基礎,但你的資料量很小的時候,或許通過掃瞄整表來訪問資料的效能還能接受,但當資料量極大時,當訪問量極大時,就一定需要通過索引的輔助才能有效地訪問資料。一般索引建立的好壞是效能好壞的成功關鍵。使用innodb作為資...
正向索引 反向索引 B Tree索引
索引就是為了更快的找出需要的資訊。一般都要進行排序。正向索引 開發出來用來儲存每個文件的單詞的列表。實際上,時間 記憶體 處理器等等資源的限制,技術上正向索引是不能實現的。既 儲存乙個文件中有那些單詞。有多少單詞就有多少列。然後對每一列進行某種排序。反向索引 其中每條記錄,記錄的是乙個單詞都在那些文...
DB索引 索引覆蓋 索引優化
索引 see 聚集索引 clustered index 聚集索引決定資料在磁碟上的物理排序,乙個表只能有乙個聚集索引,一般用primary key來約束。舉例 t user場景中,uid上的索引。非聚集索引 non clustered index 它並不決定資料在磁碟上的物理排序,索引上只包含被建立...