问一个关于 MySQL 的问题,怎么定义 MySQL 的表是动态表还是静态表?

2020-04-10 18:19:05 +08:00
 superwhite

网上搜索后,发现都是关于静态表和动态表的优势比较。那么需要提前声明这个表是动态表还是静态表吗?还是说,不用关键字声明,当表中没有变长字段( varchar...)时这个表就是静态表,有变长字段时就是动态表?

2772 次点击
所在节点    MySQL
13 条回复
pmispig
2020-04-10 18:28:47 +08:00
第一次知道 mysql 还有动态 /静态表的说法,楼主详细说说,想学习下
superwhite
2020-04-10 18:30:18 +08:00
@pmispig MyISAM 的表又支持 3 种不同的存储格式,分别是:
静态(固定长度)表;
动态表;
压缩表;

静态表是默认存储格式,字段都是非变长字段,但是占用空间通常比动态表多,静态表的数据在存储时会按照列的宽度定义补足空格。但是返回时却不会得到。需要注意,本来就有空格时怎么处理。

动态表包含变长字段,占用空间相对较少,但是频繁的更新删除记录会产生碎片,需要定期执行 optimize table 语句来改善性能,并且出现故障时恢复相对困难。
压缩表时有 myisampack 工具创建,占据非常小的磁盘空间。
superwhite
2020-04-10 18:32:08 +08:00
关于优势和特点,好像都能查到相关数据,但是我很想知道,是否需要像 engine=myisam 这样进行声明来确定表属于哪一种表
cnleon
2020-04-10 18:33:46 +08:00
myisam 除了特殊场景应该没人会用了,不支持事务。
superwhite
2020-04-10 18:38:12 +08:00
@cnleon MyISAM 是 MySQL 的默认存储引擎,不支持事务和外键,优势是访问的速度快,占用资源少,对事务完整性没有要求或者以 SELECT 、INSERT 为主的应用基本上都可以使用这个引擎来创建表。
cnleon
2020-04-10 18:40:09 +08:00
你看的什么文档? 这个貌似 5.5 之前才是默认的吧。
superwhite
2020-04-10 18:44:50 +08:00
哦,我说的版本是 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 |
+----------------------------------+--------+
pmispig
2020-04-10 20:02:44 +08:00
@superwhite 老哥,MyISAM 没人用了。。你这个知识过期了
wangyzj
2020-04-10 21:00:13 +08:00
@pmispig 离散型不需要事务的还是可以用的,比 innodb 快一点
liuxu
2020-04-10 21:24:57 +08:00
我也第一次听说,不过你这么一解释倒也说的过去。我第一直觉以为是存储在磁盘的表和内存表。。

其实有很多例子可以说明它的优势。
例如在做二进制的消息的时候,如果你是固定长度 100 字节为一条消息,你只需要从数组访问 0-99 截断就行。
但如果你是变长,要么,你在消息开头有个固定结构注明当前行有多少字节(需要额外内存);要么,设置特定字符做结尾符号,例如 c 字符串的\0,一个字符一个字符匹配,匹配到这个符号就结束(需要额外 cpu )
liuxu
2020-04-10 21:27:14 +08:00
@liuxu 等一下,我答非所问了,怎么看成优势在哪了。。
这个是 mysql 自动设置的。
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 以前的了,之前版本的性能和特性。嗯,你懂得。
superwhite
2020-04-11 14:35:20 +08:00
@Aresxue 谢了,找到了,详情见 append

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/661260

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX