InnoDB一定會在索引中加上主鍵嗎

2021-08-27 07:01:01 字數 1270 閱讀 1616

**

我之前看**記得是如果索引末尾就是主鍵,那麼innodb就不再新增主鍵了,如果索引末尾不是主鍵,那麼會新增主鍵,但是這跟測試結果不符:

create

table t (

a char(32)

notnull

primary

key,

b char(32)

notnull

,key idx1 (a,b)

,key idx2 (b,a)

) engine=innodb;

插入部分資料後可以看到idx1和idx2兩個索引的大小相同。這說明idx1和idx2的內部結構是一樣的,因此不可能是idx1在內部存為(a,b,a)。

重點:因此只要使用者定義的索引欄位中包含了主鍵中的字段,那麼這個欄位就不會再被innodb自動加到索引中了,如果使用者的索引欄位中沒有完全包含主鍵字段,innodb就會把剩下的主鍵欄位加到索引末尾。

因此我們最初的例子中, idx1 和 idx2 兩個索引內部大小完全一樣,沒有區別。

最後再補充下組合主鍵的例子:

create

table t (

a char(32)

notnull

, b char(32)

notnull

, c char(32)

notnull

, d char(32)

notnull

,primary

key(a,b)

key idx1 (c,a)

,key idx2 (d,b)

) engine=innodb;

select * from t where d=x1 and b=x2 order by a;

其實內部儲存的idx2(d,b,a)可以讓這個查詢完全走索引,但是由於server層不知道,所以最終mysql優化器可能選擇 idx2(d,b) 做過濾然後排序 a 字段,或者直接用pk掃瞄避免排序。

而如果我們定義表結構的時候就定義為 key idx2(d,b,a) ,那麼mysql就知道(d,b,a)三個字段索引中都有,並且innodb發現使用者定義的索引中包含了所有的主鍵字段,也不會再新增了,並沒有增加儲存空間。

因此,由衷的建議,所有的dba建索引的時候,都在業務要求的索引字段後面補上主鍵字段,這沒有任何損失,但是可能給你帶來意外的驚喜。

OPPO劉波 未來OPPO一定會在高階市場拿到前三

今天,oppo秋季新品發布會正式舉行。在發布會開場之前,oppo中國區總裁劉波表達了oppobiggiha要在高階市場站穩腳跟的決心。劉波表示,oppo是一家非常注重創新的公司,未來oppo將多跟大家聊聊技術,oppo也將一定會在高階市場拿到前三名。對於高階手機,劉波談到了自己的看法。劉波認為,高階...

MqSql一定一定會索引失效的幾種情況

使用explain查詢 檢視key是否命中索引 1.表層面,兩個表關聯時,如果兩個表關聯欄位的的編碼不同,不會走索引。如乙個表時 utf8,另外乙個表是utf8mb4 2.like查詢是以 開頭,索引不會命中,放後面會命中 3.如果查詢時,查詢的字段型別沒有寫對,底層會隱式處理加上函式,不會命中 4...

加了索引,mysql查詢就一定會用嗎?

一 概述 日常處理mysql問題中,往往通過增加索引來提高查詢速度,但在有些情況下,執行過程中並沒有按照我們的預期結果執行,也就是說,即使欄位加了索引,但現實也沒有使用到,到底是什麼地方出了差錯,以下我們將一 竟。二 實驗表結構宣告 我們將對以下表結構進行實際案例分析 createtable stu...