网上搜索后,发现都是关于静态表和动态表的优势比较。那么需要提前声明这个表是动态表还是静态表吗?还是说,不用关键字声明,当表中没有变长字段( varchar...)时这个表就是静态表,有变长字段时就是动态表?
1
pmispig 2020-04-10 18:28:47 +08:00
第一次知道 mysql 还有动态 /静态表的说法,楼主详细说说,想学习下
|
2
superwhite OP @pmispig MyISAM 的表又支持 3 种不同的存储格式,分别是:
静态(固定长度)表; 动态表; 压缩表; 静态表是默认存储格式,字段都是非变长字段,但是占用空间通常比动态表多,静态表的数据在存储时会按照列的宽度定义补足空格。但是返回时却不会得到。需要注意,本来就有空格时怎么处理。 动态表包含变长字段,占用空间相对较少,但是频繁的更新删除记录会产生碎片,需要定期执行 optimize table 语句来改善性能,并且出现故障时恢复相对困难。 压缩表时有 myisampack 工具创建,占据非常小的磁盘空间。 |
3
superwhite OP 关于优势和特点,好像都能查到相关数据,但是我很想知道,是否需要像 engine=myisam 这样进行声明来确定表属于哪一种表
|
4
cnleon 2020-04-10 18:33:46 +08:00
myisam 除了特殊场景应该没人会用了,不支持事务。
|
5
superwhite OP @cnleon MyISAM 是 MySQL 的默认存储引擎,不支持事务和外键,优势是访问的速度快,占用资源少,对事务完整性没有要求或者以 SELECT 、INSERT 为主的应用基本上都可以使用这个引擎来创建表。
|
6
cnleon 2020-04-10 18:40:09 +08:00
你看的什么文档? 这个貌似 5.5 之前才是默认的吧。
|
7
superwhite OP 哦,我说的版本是 5.0,sorry,刚试了,5.6 已经改了
mysql> show variables like '%engine%'; +----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+--------+ |
8
pmispig 2020-04-10 20:02:44 +08:00
@superwhite 老哥,MyISAM 没人用了。。你这个知识过期了
|
10
liuxu 2020-04-10 21:24:57 +08:00
我也第一次听说,不过你这么一解释倒也说的过去。我第一直觉以为是存储在磁盘的表和内存表。。
其实有很多例子可以说明它的优势。 例如在做二进制的消息的时候,如果你是固定长度 100 字节为一条消息,你只需要从数组访问 0-99 截断就行。 但如果你是变长,要么,你在消息开头有个固定结构注明当前行有多少字节(需要额外内存);要么,设置特定字符做结尾符号,例如 c 字符串的\0,一个字符一个字符匹配,匹配到这个符号就结束(需要额外 cpu ) |
12
Aresxue 2020-04-11 11:00:54 +08:00
没听说过静态表动态表这个说法,官方没有这个概念,估计是"以讹传讹"了。官方只有行格式 Row Formats 的概念 https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html 默认情况下就是 DYNAMIC 。顺便说一句,mysql 要用就别用 5.7 以前的了,之前版本的性能和特性。嗯,你懂得。
|
13
superwhite OP @Aresxue 谢了,找到了,详情见 append
|