V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
superwhite
V2EX  ›  MySQL

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

  •  
  •   superwhite · 2020-04-10 18:19:05 +08:00 · 2735 次点击
    这是一个创建于 1447 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    其实有很多例子可以说明它的优势。
    例如在做二进制的消息的时候,如果你是固定长度 100 字节为一条消息,你只需要从数组访问 0-99 截断就行。
    但如果你是变长,要么,你在消息开头有个固定结构注明当前行有多少字节(需要额外内存);要么,设置特定字符做结尾符号,例如 c 字符串的\0,一个字符一个字符匹配,匹配到这个符号就结束(需要额外 cpu )
    liuxu
        11
    liuxu  
       2020-04-10 21:27:14 +08:00
    @liuxu 等一下,我答非所问了,怎么看成优势在哪了。。
    这个是 mysql 自动设置的。
    Aresxue
        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 以前的了,之前版本的性能和特性。嗯,你懂得。
    superwhite
        13
    superwhite  
    OP
       2020-04-11 14:35:20 +08:00
    @Aresxue 谢了,找到了,详情见 append
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5458 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.