《Mysql入門mysql索引教程之聚集索引》要點(diǎn):
本文介紹了Mysql入門mysql索引教程之聚集索引,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL實(shí)例本節(jié)內(nèi)容:
mysql索引之聚集索引
MYSQL實(shí)例聚集索引不是一種單獨(dú)的索引類型,而是一種存儲(chǔ)數(shù)據(jù)方式.
其具體細(xì)節(jié)依賴于實(shí)現(xiàn)方式,但是InnoDB的聚集索引實(shí)際上在同樣的結(jié)構(gòu)中保存了B-Tree索引和數(shù)據(jù)行.
MYSQL實(shí)例當(dāng)表有聚集索引的時(shí)候,它的數(shù)據(jù)行實(shí)際保存在索引的葉子頁中.術(shù)語“聚集”指實(shí)際的數(shù)據(jù)行和相關(guān)的鍵值都保存在一起.
每個(gè)表只能有一個(gè)聚集索引,因?yàn)椴荒芤淮伟研斜4嬖趦蓚€(gè)地方.(但是,覆蓋索引可以模擬多個(gè)聚集索引)
MYSQL實(shí)例當(dāng)前,SolidDB和InnoDB是唯一支持聚集索引的存儲(chǔ)引擎.InnoDB按照主鍵進(jìn)行聚集,如果沒有定義主鍵,InnoDB會(huì)試著使用唯一的非空索引來代替.如果沒有這種索引,InnoDB就會(huì)定義隱藏的主鍵然后在上面進(jìn)行聚集.
MYSQL實(shí)例聚集主鍵有助于性能,但是它也能導(dǎo)致嚴(yán)重的性能問題.
MYSQL實(shí)例優(yōu)點(diǎn):
1,可以把相關(guān)數(shù)據(jù)保存在一起.
2,數(shù)據(jù)訪問快.聚集索引把索引和數(shù)據(jù)都保存到同一棵B-Tree中,因此從聚集索引中取得數(shù)據(jù)通常在非聚集索引進(jìn)行查找要快.
3,使用覆蓋索引的查詢可以使用包含在葉子節(jié)點(diǎn)中的主鍵值
如果表和查詢可以使用它們,這些優(yōu)點(diǎn)能極大地提高性能.
MYSQL實(shí)例缺點(diǎn):
1,聚集能最大限度地提升I/O密集負(fù)載的性能.如果數(shù)據(jù)能裝入內(nèi)存,那么其順序也就無怕謂了,這樣聚集就沒什么用處.
2,插入速度嚴(yán)重依賴于插入順序.按照主鍵的順序插入行是把數(shù)據(jù)裝入InnoDB表最快的方法.如果沒有按照主鍵順序插入數(shù)據(jù),那么在插入之后最好使用OPTIMIZE TABLE重新組織一下表.
3,更新聚集索引列是昂貴的,因?yàn)樗鼜?qiáng)制InnoDB把每個(gè)更新的遷移到新的位置.
3,建立在聚集索引上的表在插入新行,或者在行的主鍵被更新,該行必須被移動(dòng)的時(shí)候會(huì)進(jìn)行分頁.分布發(fā)生在行的鍵值要求行必須被放到一個(gè)已經(jīng)放滿了數(shù)據(jù)的頁的時(shí)候,此時(shí)存儲(chǔ)引擎必須分頁才能容納該行.分頁會(huì)導(dǎo)致表占用更多的磁盤空間
4,聚集表可能會(huì)比全表掃描慢,尤其在表存儲(chǔ)得比較稀疏或因?yàn)榉猪摱鴽]有順序存儲(chǔ)的時(shí)候.
5,第二(非聚集)索引可能會(huì)比預(yù)想的大,因?yàn)樗鼈兊娜~子節(jié)點(diǎn)包含了被引用行的主鍵列.
6,第二索引訪問需要兩次索引查找,而不是一次(葉子節(jié)點(diǎn)不會(huì)保存引用的行的物理位置,而是保持了行的主鍵值)
MYSQL實(shí)例這意味著為了從第二索引查找行,存儲(chǔ)引擎首先要找到葉子,然后使用保存在那里的主鍵值找到主鍵.最終找到行.這需要兩次動(dòng)作,兩次B-Tree導(dǎo)航(在InnoDB中,自適應(yīng)哈希索引能減少這種損失)
MYSQL實(shí)例如果正在使用InnoDB并且不需要任何特定的聚集,就可以定義一個(gè)代理鍵.它是一種主鍵,但是值和應(yīng)用程序無關(guān).最簡(jiǎn)單的方法是使用AUTO_INCREMENT列.這會(huì)是順序插入的并且能提高使用主鍵聯(lián)接的性能,減少分頁和碎片產(chǎn)生.
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/6447.html