myisam使用字首壓縮來減少索引的大小,從而讓更多的索引可以放入記憶體中,預設只壓縮字串,但通過引數配置也可以對整數做壓縮,myisam壓縮每個索引塊的方法是,先完全儲存索引塊中的第乙個值,然後將其他值和第乙個值進行比較得到相同字首的位元組數(長度)和剩餘的不同字尾部分(即把相同部分去掉),把這部分儲存起來即可(相同字首長度和不同字尾部分字串)。如:索引塊中的第乙個值是perform,第二個是performance,那麼第二個值的字首壓縮後儲存的是類似7,ance,這樣的形式,myisam對行指標也採用類似的字首壓縮方式。
壓縮塊使用更少的空間,代價是某些操作可能更慢,因為每個值的壓縮字首都依賴於前面的值,所以myisam查詢時無法在索引塊使用二分查詢而只能從頭開始掃瞄,正序的掃瞄速度還不錯,但如果是倒序掃瞄,如:order by desc就不是很好了,所有在塊中查詢某一行的操作平均都需要掃瞄半個索引塊。
測試表明,對於cpu密集型應用,因為掃瞄需要隨機查詢,壓縮索引使得myisam在索引查詢上要慢好幾倍,壓縮索引的倒序掃瞄就更慢了,壓縮索引需要在cpu記憶體資源與磁碟之間做權衡,壓縮索引可能只需要十分之一大小的磁碟,如果是io密集型應用,對於某些查詢帶來的好處會比成本多很多。即壓縮索引適合io密集型應用,不太適合cpu密集型應用。
可以在create table語句中指定pack_keys引數來控制myisam表的索引壓縮方式:
pack_keys [=]
0: 表示關閉索引壓縮
1: 表示開啟數字和字串壓縮
default:表示只壓縮超長字串char和varchar列
如果建表時不指定這個選項,那麼預設只壓縮字串,不壓縮數字
Mysql MyISAM 壓縮(字首壓縮)索引
myisam使用字首壓縮來縮小索引,從而讓更多的索引能夠放入記憶體中達到快速索引的目的 我們都知道innodb儲存引擎的索引維護過程中會儲存完整的列值到索引節點,myisam則有所不同,比如我們在乙個varchar列上建立了索引,儲存了類似 chin china chinese 字串,那麼在myis...
MYISAM表批量壓縮
引言 最近mysql的資料庫,資料達到了1.4t了,而且這些資料都是只供查詢的歷史資料。所以我想到mysql的資料壓縮,變成唯讀模式。關於對myisam表的壓縮,可以使用myisampack和myisamchk完成 myisampack完之後必須進行myisamchk才能使用壓縮後的表,而且是唯讀的...
MYISAM表批量壓縮
myisam表批量壓縮 這兩個操作需要謹慎使用,在壓縮之前需要確認mysqld已關閉或者要壓縮的表不會有其他的sql操作 而且壓縮過程會很占用cpu資源,建議在伺服器空閒的狀態進行。下面是用於實現某資料庫下表壓縮的shell過程 值得注意的是,如果資料量大,建議分多次操作,因其會很耗時 1 bin ...