唯一索引和普通索引怎麼選擇

2022-02-04 04:06:11 字數 2540 閱讀 5033

前段時間還在忙,終於又出點空更新了,雖然不是所有的付出都有收穫,很多時候需要我們先付出才可以看到希望。

mysql 類的文章看的人比較少,我想一方面可能是大家更熱衷於比較前言的技術,像 mysql 類的已經發展很久的基礎資料庫,關注的人反而少,當時我在學習 mysql 的過程中發現,mysql 的很多優秀的技術在大資料很多開源框架中都能看到影子,所以還是按照筆記的方式把這個系列寫完吧,當然也會穿插些其他內容。

其實,如果業務上就要求我們資料庫的值必須是唯一的,那沒什麼好討論的,就選擇唯一索引;那麼如果業務上要求不嚴格,或者說不需要我們資料庫後台來保障唯一性要求,這時候我們選擇唯一索引還是普通索引就看誰在效能上更好,誰好選誰。

對於資料庫查詢來說,以前介紹過,innodb 引擎的索引以 b+樹這種資料結構儲存的,我們在利用索引查詢的時候,先從 b+樹的葉子節點進行按層搜尋,定位到我們資料在的資料頁,資料頁內基本按照二分法查詢我們具體要查詢的資料。

唯一索引: 我們查詢到需要查詢的值後,由於唯一索引,所以只有乙個值,所以可以直接返回。 從這個角度來看,唯一索引更快。但是影響並不大,是因為我們讀取資料的時候都是按照資料頁去讀取的, 乙個資料頁預設大小為 64k,可以存上千個索引值。那普通索引的移動指標到下乙個元素和比較的資料都是在記憶體中的,所以影響比較小。

我們想一下,mysql 的資料報含兩個部分,一部分在記憶體中,一部分在磁碟上,在記憶體中的不光是 mysql 的資料還有索引。 那麼我們在更新的時候,如果資料在記憶體裡面好說,直接更新,定期重新整理到磁碟,但是更多的時候可能是資料不在記憶體中,如果每次都從磁碟讀取資料所在的資料頁,然後去操作,就需要至少涉及到一次磁碟的隨機讀操作,比較昂貴的操作。

那麼我們是否可以在記憶體裡面中把這個更新操作紀錄下來,在合適的時候再將資料合併到磁碟上。這塊內存在 mysql 中就叫 change buffer,(看到 buffer,可能就會認為只存在記憶體中,實際上 change buffer 不光在記憶體中也存在磁碟上,同步到資料庫的系統表空間 ibdata1),更新操作的時候,資料如果不在記憶體中,且不影響資料(比如不影響資料的唯一性的情況下),我們把更新操作紀錄到 change buffer 上,並不需要從磁碟上讀取資料頁。這時候,如果來了乙個查詢動作,剛好要查這條資料的情況下,mysql 會從磁碟上讀取這個資料頁,然後發現 change buffer 有修改了這個資料頁,會將這個資料頁修改的內容 merge 到這個資料頁上。 查詢配置如下:

mysql> show variables like '%innodb_change_buffer%';

+-------------------------------+-------+

| variable_name | value |

+-------------------------------+-------+

| innodb_change_buffer_max_size | 25 |

| innodb_change_buffering | all |

+-------------------------------+-------+

2 rows in set, 1 warning (0.03 sec)

mysql> show variables like '%innodb_buffer_pool_size%';

+-------------------------+---------+

| variable_name | value |

+-------------------------+---------+

| innodb_buffer_pool_size | 8388608 |

+-------------------------+---------+

1 row in set, 1 warning (0.01 sec)

innodb_change_buffer 為 change_buffer 佔 innodb_buffer_pool_size 中的百分比,這裡面 25%最大為 50%,我這個本機配置實在是太低了。

innodb_change_buffering 表示哪些場景用 change_buffer 取值:all/none/inserts/deletes

所以從更新角度看,普通索引可以利用 change buffer 更新操作的效能比唯一索引要更好。這裡面要說明的是有些人可能會認為像插入操作,我們需要乙個主鍵,主鍵是唯一索引,所以插入操作是用不到 change buffer,這樣是不對的,因為乙個表一般除了主鍵還有二級索引,主鍵用不到,二級索引可以用到 change buffer。

不是所有的場合都適合使用 change buffer 的,change buffer 的本質是通過減少磁碟的隨機 io 讀的訪問來提公升系統的效能。

江城子·墨雲拖雨過西樓

[宋] 蘇軾

墨雲拖雨過西樓。水東流。晚煙收。

柳外殘陽,回照動簾鉤。

今夜巫山真個好,花未落,酒新篘。

美人微笑轉星眸。月花羞。捧金甌。

歌扇縈風,吹散一春愁。

試問江南諸伴侶,誰似我,醉揚州。

mysql普通索引和唯一索引選擇

mysql普通索引和唯一索引的區別 所以,普通索引和唯一索引的主要區別在於插入和修改,換個說法就是能否使用change buffer,那麼change buffer就是是什麼,有什麼用就是我們接下來要討論的話題。change buffer中儲存的是mysql的更新操作 從名字上就能看出來 當我們在更...

mysql唯一索引和普通索引的選擇

結論 如果業務能夠保證唯一性應該盡量選擇普通索引而不是唯一索引 從查詢和更新兩方面說明 查詢 查詢來說二者的區別是 普通索引查到符合條件的項後會繼續查詢下一項,如果下一項不符合再返回 唯一索引則是查到符合條件的項後就直接返回 其實這兩種方式效率幾乎沒有差別,因為查詢都是先讀取資料項然後在記憶體中進行...

mysql 普通索引和唯一索引的選擇

看完上面的圖來總結changebuffer的選擇和設定 change buffer動態設定 change buffer 用的是 buffer pool 裡的記憶體,因此不能無限增大。change buffer 的大小,可以通過引數 innodb change buffer max size 來動態設...