MySQL根据列数据类型将表的行格式指定为固定或动态.如果表具有可变长度的列数据类型,例如TEXT或VARCHAR,则行格式是动态的;否则,它是固定的.

我的问题是,这两种行格式有什么区别?一个比另一个更有效率吗?

推荐答案

这种差异实际上只对MyISAM重要,其他存储引擎并不关心这种差异.

对于具有固定宽度行的MyISAM,有几个优点:

  1. 无行碎片:对于可变宽度的行,可以在数据文件中将单行拆分为多个部分.这会增加磁盘搜索并降低操作速度.可以使用优化表对其进行碎片整理,但这并不总是可行的.

  2. 数据文件指针大小:在MyISAM中,有一个数据文件指针的概念,在需要引用数据文件时使用.例如,当索引引用行实际存在的位置时,会在索引中使用此选项.对于固定宽度的大小,该指针基于文件中的行偏移量(即,无论大小,行都是1、2、3).对于可变宽度,指针基于字节偏移量(即行可能是1、57、163).结果是,对于大型表,指针需要更大,这可能会给表增加更多开销.

  3. 更容易解决腐败问题.由于每一行的大小都相同,如果MyISAM表损坏,修复起来就容易得多,因此只会丢失实际损坏的数据.对于可变宽度,从理论上讲,可变宽度指针可能会出错,这可能会导致以错误的方式处理数据.

现在固定宽度的主要缺点是它浪费了更多的空间.例如,您需要使用CHAR字段而不是VARCHAR字段,因此最终会占用额外的空间.

通常情况下,您在格式上没有太多 Select ,因为它是基于模式指定的.然而,如果您只有几个varchar或一个blob/text来try 为此进行优化,这可能是值得的.例如,考虑将唯一的VARCHAR转换成字符,或者将BLUB拆分到它自己的表中.

您可以在以下网站上阅读更多关于此的信息:

http://dev.mysql.com/doc/refman/5.0/en/static-format.html

http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html

Mysql相关问答推荐

为什么IN子句中有GROUP BY会导致查询变得不可执行?

根据计数按月和年对数据进行分组()

如何使用GROUP BY调优简单SQL查询

插入时发生日期时间字段溢出错误

表列中的SQL SUM MENY值记录单个查询

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

MySQL - 如何根据单列查找重复行?

如何解码存储在带有type*:前缀的base64中的数据?

如何获取每日登录用户数?

在 MySQL 中跨日期和位置计算和排序实体的共现

mySql 查询运行速度超慢

MySQL 使用了错误的索引

SQL 中的双杠 (||) 是什么意思?

MySQL使用多列 Select 重复记录

何时在 mysql 中使用 TEXT 而不是 VARCHAR

如何在 MySQL 中为用户设置默认架构

MySQL 在每个唯一值第一次出现时 Select 行

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

从 MySQL JSON 数据类型中提取不带引号的值