在業務**已經保證了不會寫入重複的字段,那麼盡量使用普通索引
普通索引與唯一索引對比:
在查詢過程
select id from t where k=5;從這條查詢語句開始分析,分別分析k為普通索引時與唯一索引是的區別
普通索引:在查到滿足條件的記錄,還需要繼續往下查詢。這裡就用到了之前說的假設,業務已經保證了不會寫入重複字段,否則查詢次數與重覆記錄成線性增長。但是若不重複的情況。也就比唯一索引多一次查詢比較的操作。innodb資料是以記憶體頁儲存的。innodb的資料頁預設大小16kb,資料讀就讀乙個資料頁。
唯一索引:查詢到滿足條件的記錄直接返回。
對於查詢來說 普通索引與唯一索引基本差不多。
比較大的差別是在更新過程中:(ps:尤其是寫多讀少的系統)
當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,如果這個資料頁不在記憶體中,innodb會在不影響資料一致性的情況下,將更新操作快取在change buffer中,這樣就不需要從磁碟中讀入這個資料頁。下次訪問這個資料頁時候,從磁碟將資料頁讀入記憶體,從change buffer 中拿到這個資料頁是更新操作。將這個頁更新成髒頁。changebuffer也是會被持久化的。將change buffer 應用到資料頁上的操作稱為merge,除了當訪問這個資料頁的時候,會merge,有後台執行緒定期merge。在資料庫正常關閉也會merge。
change buffer減少了將資料頁讀入記憶體,mysql的記憶體是從buffer pool 分配的,從而避免占用記憶體,提高記憶體佔用率。所以對於寫入後立馬會讀的系統,change buffer並不會提高更新效率。
唯一索引不使用change buffer
在實際使用過程中,普通索引和change buffer的配合使用,對於資料量大的表的更新優化還是很明顯的。
redo log wal提公升效能的核心機制是儘量減少了隨機讀寫。將隨機讀寫變為了順序讀寫。
change buffer主要節省的是隨機讀磁碟的io,在更新操作時不用從磁碟讀書資料。
唯一索引和普通索引怎麼選擇
前段時間還在忙,終於又出點空更新了,雖然不是所有的付出都有收穫,很多時候需要我們先付出才可以看到希望。mysql 類的文章看的人比較少,我想一方面可能是大家更熱衷於比較前言的技術,像 mysql 類的已經發展很久的基礎資料庫,關注的人反而少,當時我在學習 mysql 的過程中發現,mysql 的很多...
mysql普通索引和唯一索引選擇
mysql普通索引和唯一索引的區別 所以,普通索引和唯一索引的主要區別在於插入和修改,換個說法就是能否使用change buffer,那麼change buffer就是是什麼,有什麼用就是我們接下來要討論的話題。change buffer中儲存的是mysql的更新操作 從名字上就能看出來 當我們在更...
MySQL普通索引與唯一索引
總結參考文獻 當我們需要在乙個唯一欄位上建立索引時,究竟是建立普通索引還是唯一索引的效能更好呢?這時需要從兩個角度考慮 對於普通索引來說,查詢到滿足條件的第乙個記錄後,需要查詢下乙個記錄,直到碰到第乙個不滿足條件的記錄。對於唯一索引來說,由於索引定義了唯一性,查詢到第乙個滿足條件的記錄後,就會停止繼...