superwhite
V2EX  ›  MySQL

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

By superwhite at 2020 年 4 月 10 日 · 4087 次点击

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

第 1 条附言  ·  2020 年 4 月 11 日
13 条回复  •  2020-04-11 14:35:20 +08:00
pmispig
   1
pmispig  
   2020 年 4 月 10 日
第一次知道 mysql 还有动态 /静态表的说法,楼主详细说说,想学习下
superwhite
   2
superwhite  
OP
   2020 年 4 月 10 日
@pmispig MyISAM 的表又支持 3 种不同的存储格式,分别是:
静态(固定长度)表;
动态表;
压缩表;

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

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

其实有很多例子可以说明它的优势。
例如在做二进制的消息的时候,如果你是固定长度 100 字节为一条消息,你只需要从数组访问 0-99 截断就行。
但如果你是变长,要么,你在消息开头有个固定结构注明当前行有多少字节(需要额外内存);要么,设置特定字符做结尾符号,例如 c 字符串的\0,一个字符一个字符匹配,匹配到这个符号就结束(需要额外 cpu )
liuxu
   11
liuxu  
   2020 年 4 月 10 日
@liuxu 等一下,我答非所问了,怎么看成优势在哪了。。
这个是 mysql 自动设置的。
Aresxue
   12
Aresxue  
   2020 年 4 月 11 日
没听说过静态表动态表这个说法,官方没有这个概念,估计是"以讹传讹"了。官方只有行格式 Row Formats 的概念 https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html 默认情况下就是 DYNAMIC 。顺便说一句,mysql 要用就别用 5.7 以前的了,之前版本的性能和特性。嗯,你懂得。
superwhite
   13
superwhite  
OP
   2020 年 4 月 11 日
@Aresxue 谢了,找到了,详情见 append
› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
© 2026 V2EX · 41ms · 3.9.8.5