MyISAM key 压缩

MyISAM 存储引擎 使用 key压缩,为了始索引更小,为了更好的适应caches和显著的改进性能,myisam执行比innodb更好的
原因是索引压缩不是频繁发生的。
PACK_KEYS=0|1|DEFAULT
0: 不压key
1:压缩key
default:(只压缩字符) key compression for character column type but not for numerical and other column types.
 
ALTER TABLE `table` PACK_KEYS =0
 
MySQL 将使用 prefix 压缩。
Prefix 压缩意味着每个键都需要一个额外的字节来指示前一个键有多少字节与下一个键相同。
如果在一个记录行上有连续两行的相等键,下面所有“相同”的键通常只占用 2 个字节。
 
压缩好还是不压缩好?
 
看三种情况:
向前遍历   将会快,不需要解压缩 因为已经记录了下一个值的位置。
回溯遍历   会慢,需要解压缩 。
随即遍历   需要解压每一个key
 
看一个例子:
 
CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL ,
`c` varchar(20) NOT NULL default ”,
KEY `c` (`c`),
KEY `id` (`id`)
) ENGINE=MyISAM
  • PACK_KEYS=DEFAULT – 1550K
  • PACK_KEYS=1 – 1453K
  • PACK_KEYS=0 – 8176K
默认的大小 1550k ,  压缩的1453k ,  不压缩的8176k
 
     select count(*) from t1, t1 t2 where t1.c=t2.c      #字符key

select count(*) from t1, t1 t2 where t1.id=t2.id #数字key

select c from t1 where c like%abc%order by c limit 1 #向前遍历

select c from t1 where c like%abc%order by c desc limit 1 #回溯遍历

  • PACK_KEYS=DEFAULT            PACK_KEYS=0       PACK_KEYS=1
  • Q1: 3.50s                    Q1: 1.25s         Q1: 3.50s
  • Q2: 0.35s                    Q2: 0.40s         Q2: 1.55s
  • Q3: 0.12s                    Q3: 0.14s         Q3: 0.12s
  • Q4: 1.26s                    Q4: 0.16s         Q4: 1.26s  
 
   观看第1条:用的字符key                    不压缩0的最快 1.25s,不用解压缩比较
   观看第2条:用的数字key                    默认的defautl和0最快0.35s
   观看第3条:用的向前遍历asc 字符        压缩不压缩不影响,(Prefix 压缩算法) 不压缩比压缩慢了0.02 ;可能是 压缩的占用内存少,不用交换内存。
   观看第4条:用的回溯遍历desc 字符      不压缩的最快,跟压缩差的很大
 
总结 : 避免 join 字符串   ,   避免压缩key 的回溯。 pack = 1能让你字符和数字的join 都下降。 pack=0 让你空间浪费10倍(看上面的文件大小)
 
 
原文地址:https://www.cnblogs.com/mysqlinternal/p/2426934.html