mysql 冗餘和重複索引

2022-06-17 21:12:18 字數 1765 閱讀 7285

mysql允許在相同列上建立多個索引,無論是有意還是無意,mysql需要單獨維護重複的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響效能。

create

table

test(

id intnot

null

primary

key,

a intnot

null

, b

intnot

null,

unique

(id),

index

(id),

) engine

=innodb;

這段sql建立了3個重複索引。通常並沒有理由這麼做。

冗餘索引和重複索引有一些不同,如果建立了索引(a,b),再建立索引(a)就是冗餘索引,因為這只是前面乙個索引的字首索引,因此(a,b)也可以當作(a)來使用,但是(b,a)就不是冗餘索引,索引(b)也不是,因為b不是索引(a,b)的最左字首列,另外,其他不同型別的索引在相同列上建立(如雜湊索引和全文索引)不會是b-tree索引的冗餘索引,而無論覆蓋的索引列是什麼。

冗餘索引通常發生再為表新增新索引的時候。例如,有人可能會增加乙個新的索引(a,b)而不是擴充套件以後的索引(a)。還有一種情況是將乙個索引擴充套件為(a,id),其中id是主鍵,對於innodb來說主鍵已經包含在二級索引中了,所以這也是冗餘的。

大多數情況下都不需要冗餘索引,應該盡量擴充套件已有的索引而不是建立新索引,但也有時候處於效能方面的考慮需要冗餘索引,因為擴充套件已有的索引會導致其變得太大,從而影響其他使用該索引的查詢效能。如:如果在整數列上有乙個索引,現在需要額外增加乙個很長的varchar列來擴充套件該索引,那麼性可能會急劇下降,特別是有查詢把這個索引當作覆蓋索引,或者這是myisam表並且有很多範圍查詢的時候(由於myisam的字首壓縮)

比如,有一張userinfo表。這個表有1000000條資料,對每個state_id值大概有20000條記錄。在state_id有乙個索引,那麼下面的sql我們稱之為q1

select

count(*) from userinfo where state_id=

5; --q1

改查詢的執行速度大概是每秒115次(qps)

還有乙個sql,我們稱之為q2

select state_id,city,address from userinfo where state_id=

5; --q2

這個查詢的qps是10,提公升該索引效能最簡單的辦法就是狂戰索引為(state_id,city,address),讓索引能覆蓋查詢:

alert table userinfo add

key state_id_2(state_id,city,address);

(注:state_id已經有索引了,根據前面的概念,這是乙個冗餘索引而不是重複索引)

怎麼找出冗餘索引和重複索引呢?

1.可以使用shlomi noach的common_schema中的一些試圖來定位,common_schema是一系列可以安裝到伺服器上的常用的儲存和試圖。

2.可以使用percona toolkit中的pt_duplicate-key-checker,該工具通過分析表結構來找出冗餘和重複的索引。

[1] baron schwartz等 著,寧海元等 譯 ;《高效能mysql》(第3版); 電子工業出版社 ,2013

mysql冗餘索引 MySQL 冗餘和重複索引

冗餘和重複索引冗餘和重複索引的概念 mysql允許在相同列上建立多個索引,無論是有.冗餘和重複索引 冗餘和重複索引的概念 mysql允許在相同列上建立多個索引,無論是有意的還是無意的。mysql需要單獨維護重複的索引,香港虛擬主機,並且優化器在優化查詢的時候也需要逐個地進行考慮,香港虛擬主機,這會影...

詳解mysql中的冗餘和重複索引

mysql允許在相同列上建立多個索引,無論是有意還是無意,mysql需要單獨維護重複的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響效能。重複索引是指的在相同的列上按照相同的順序建立的相同型別的索引,應該避免這樣建立重複索引,發現以後也應該立即刪除。但,在相同的列上建立不同型別的索引...

mysql 查詢冗餘索引 冗餘索引對查詢效率的影響

結果一 與執行計畫相關的索引 出現在possible keys的那些 索引的數量與sql執行消耗時間成正比。create index idx1 on test index performance col1 create index idx2 on test index performance col...