原文 http://jackyrong.iteye.com/blog/2170222 在mysql的myisam引擎中,有一個是容易忽視的,叫壓縮索引PACK_KEYS , myISAM使用首碼壓縮來減小索引大小,預設情況下會壓縮字元串,也可以壓縮整數 可以使用create table時用PACK_ ...
原文 http://jackyrong.iteye.com/blog/2170222
在mysql的myisam引擎中,有一個是容易忽視的,叫壓縮索引PACK_KEYS ,
myISAM使用首碼壓縮來減小索引大小,預設情況下會壓縮字元串,也可以壓縮整數
可以使用create table時用PACK_KEYS控制索引壓縮的方式。
PACK_KEYS在MySQL手冊中如下描述:
如果您希望索引更小,則把此選項設置為1。這樣做通常使更新速度變慢,同時閱讀速度加快。把選項設置為0可以取消所有的關鍵字壓縮。把此選項設置為DEFAULT時,存儲引擎只壓縮長的CHAR或VARCHAR列(僅限於MyISAM)。
如果您不使用PACK_KEYS,則預設操作是只壓縮字元串,但不壓縮數字。如果您使用PACK_KEYS=1,則對數字也進行壓縮。
在對二進位數字關鍵字進行壓縮時,MySQL採用首碼壓縮:
o 每個關鍵字需要一個額外的位元組來指示前一個關鍵字中有多少位元組與下一個關鍵字相同。
o 指向行的指針以高位位元組優先的順序存儲在關鍵字的後面,用於改進壓縮效果。
這意味著,如果兩個連續行中有許多相同的關鍵字,則後續的“相同”的關鍵字通常只占用兩個位元組(包括指向行的指針)。與此相比,常規情況下,後續的關鍵字占用storage_size_for_key + pointer_size(指針尺寸通常為4)。但是,只有在許多數字相同的情況下,首碼壓縮才有好處。如果所有的關鍵字完全不同,並且關鍵字不能含有NULL值,則每個關鍵字要多使用一個位元組。(在這種情況中,儲存壓縮後的關鍵字的長度的位元組與用於標記關鍵字是否為NULL的位元組是同一位元組。
比如有個欄位保存 文件名,如"abc.pdf",其中pdf大家都是一樣的,因此可以
根據這個欄位採用壓縮索引:
CREATE TABLE <TABLE_NAME> (
`id` INT NOT NULL ,
`name` VARCHAR(250) NULL ,
PRIMARY KEY (`id`) )
PACK_KEYS = 1;
ALTER TABLE table_name PACK_KEYS = 1;