› 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 · Apr 10, 2020 · 4107 views
    This topic created in 2367 days ago, the information mentioned may be changed or developed.

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

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

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

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

    其实有很多例子可以说明它的优势。
    例如在做二进制的消息的时候,如果你是固定长度 100 字节为一条消息,你只需要从数组访问 0-99 截断就行。
    但如果你是变长,要么,你在消息开头有个固定结构注明当前行有多少字节(需要额外内存);要么,设置特定字符做结尾符号,例如 c 字符串的\0,一个字符一个字符匹配,匹配到这个符号就结束(需要额外 cpu )
    liuxu
        11
    liuxu  
       Apr 10, 2020
    @liuxu 等一下,我答非所问了,怎么看成优势在哪了。。
    这个是 mysql 自动设置的。
    Aresxue
        12
    Aresxue  
       Apr 11, 2020
    没听说过静态表动态表这个说法,官方没有这个概念,估计是"以讹传讹"了。官方只有行格式 Row Formats 的概念 https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html 默认情况下就是 DYNAMIC 。顺便说一句,mysql 要用就别用 5.7 以前的了,之前版本的性能和特性。嗯,你懂得。
    superwhite
        13
    superwhite  
    OP
       Apr 11, 2020
    @Aresxue 谢了,找到了,详情见 append
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2169 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 178ms · UTC 15:51 · PVG 23:51 · LAX 08:51 · JFK 11:51
    ♥ Do have faith in what you're doing.