mysql中ROW_FORMAT的选择问题

 更新时间:2023年10月18日 15:00:34   作者:蜡津  
这篇文章主要介绍了mysql中ROW_FORMAT的选择问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

文章中看到这样一句话,引起了我的深思,然后去研究了一下 ROW_FORMAT

CHAR 与VARCHAR 之间的特点与选择

CHAR和VARCHAR的区别如下:

1)、CHAR是固定长度字符, VARCHAR是可变长度字符;

2)、CHAR会自动删除插入数据的尾部空格, VARCHAR不会删除尾部空格。 

CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点就是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。

存储引擎对于选择CHAR和VARCHAR的影响

对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。

对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好。 

在MySQL中,所谓Row_Format行格式是指数据记录(或者称之为行)在磁盘中的物理存储方式。

MyISAM行存储

MyISAM有3种行存储格式:fixed/dynamic/compressed  

1、fixed:为默认格式,只有当表不包含变长字段(varchar/varbinary/blob/text)时使用,该每行都是固定的,所以很容易获取行在页上的具体位置,存取效率比较高,但是占用磁盘空间较多

InnoDB行存储  

Innodb plugin新引入Barracuda,其包含compressed/dynamic两种行格式,而之前的compact/redundant统属于antelope;

目前可选值为Antelope和Barracuda,低版本默认为Antelope,高版本默认为Barracuda。

1. Antelope: 它支持两种行格式:COMPACT 和 REDUNDANT。MySQL5.6的默认文件格式。可以与早期的版本保持最大的兼容性。不支持 Barracuda 文件格式。

2. Barracuda: 新的文件格式。它支持InnoDB的所有行格式,包括新的行格式:COMPRESSED 和 DYNAMIC。

在 msyql 5.7.9 及以后版本,默认行格式由innodb_default_row_format变量决定,它的默认值是DYNAMIC,也可以在 create table 的时候指定ROW_FORMAT=DYNAMIC。用户可以通过命令 SHOW TABLE STATUS LIKE'table_name' 来查看当前表使用的行格式,其中 row_format 列表示当前所使用的行记录结构类型。

如果要修改现有表的行模式为compressed或dynamic,必须先将文件格式设置成Barracuda:set global innodb_file_format=Barracuda;,再用ALTER TABLE tablename ROW_FORMAT=COMPRESSED;去修改才能生效。

InnoDB存储引擎Compact、Redundant、Dynamic、Compressed主要区别

1)、compact、Dynamic、Compressed 行格式下,字段为NULL值是不会在记录的数据内容中占用存储空间,冗余存储的;

2)、redundant行格式下,如果值为NULL的字段类型为变长数据类型,不会在记录的数据内容中占用任何空间来进行存储的,

如果值为NULL的字段类型为定长数据类型,其使用0x00来填充该字段所需占用的空间。

例如char(10)类型的字段,在ascii、utf8字符集中其Maxlen值分别为1、3。即该字段在数据内容部分会分别占用的10、30个字节。故当该字段为NULL值时,会使用0x00来填充这10、30个字节的位置。

行溢出

compact、redundant行格式中,如果该记录某字段中数据量过多时,则在该记录的数据内容的相应字段处只存储该字段值前768个字节的数据和一个指向存储剩余数据的其他页(即所谓的溢出页)的地址,该地址通常占用20个字节。

Dynamic、Compressed行格式中,会把记录中数据量过大的字段值全部存储到溢出页中,而不会在该记录的数据内容的相应字段处存储该字段值前768个字节的数据了。

而compressed相比较dynamic行格式来说,前者会使用压缩算法对所有页面(自然也包括溢出页)进行压缩以减少存储占用。

遇到过这样一个问题,原因是InnoDB不支持ROW_FORMAT为FIXED。

mysql>  create table tmp11(id varchar(10)) ROW_FORMAT=FIXED;
ERROR 1031 (HY000): Table storage engine for 'tmp11' doesn't have this option
mysql> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql创建用户并赋予用户权限详细操作教程

    mysql创建用户并赋予用户权限详细操作教程

    这篇文章主要给大家介绍了关于mysql创建用户并赋予用户权限详细操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • MySQL表数据文件损坏导致数据库无法启动的原因与解决方案

    MySQL表数据文件损坏导致数据库无法启动的原因与解决方案

    在日常的数据库管理中,遇到MySQL表数据文件损坏的情况并不罕见,这种情况下,MySQL数据库可能会无法正常启动,给业务运行带来严重影响,本文将探讨如何诊断和解决MySQL表数据文件损坏导致的数据库无法启动问题,需要的朋友可以参考下
    2025-03-03
  • mysql主从复制配置过程

    mysql主从复制配置过程

    网站面临大流量的情况下,数据库读写成了性能瓶颈。除了使用多级缓存外,进行数据读写分离,也是提高网站承载能力重要的手段。本文介绍mysql读写分离、mysql主从复制配置过程。
    2020-09-09
  • MySQL子查询用法实例分析

    MySQL子查询用法实例分析

    这篇文章主要介绍了MySQL子查询用法,结合实例形式对比分析了MySQL子查询的设置技巧,需要的朋友可以参考下
    2016-04-04
  • 详解MYSQL的备份还原(PHP实现)

    详解MYSQL的备份还原(PHP实现)

    本篇文章是对MYSQL的备份还原进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL 字符串拆分实例(无分隔符的字符串截取)

    MySQL 字符串拆分实例(无分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分实例(无分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • mysql按天/小时/半小时/N分钟/分钟进行数据分组统计功能

    mysql按天/小时/半小时/N分钟/分钟进行数据分组统计功能

    我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等,下面给大家分享mysql按天/小时/半小时/N分钟/分钟进行数据分组统计功能,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • mysql中格式化日期详解

    mysql中格式化日期详解

    最近因为工作需要,要使用mysql查询记录可如果有时间戳字段时,查看结果不方便,不能即时看到时间戳代表的含义,所以这篇文章就提供mysql格式换时间函数,可以方便的看到格式化后的时间。有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • mysql之查询两个时间段是否有交集的情况

    mysql之查询两个时间段是否有交集的情况

    这篇文章主要介绍了mysql之查询两个时间段是否有交集的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MySQL 集群迁移到 Kubernetes操作步骤

    MySQL 集群迁移到 Kubernetes操作步骤

    这篇文章主要为大家介绍了MySQL 集群迁移到 Kubernetes使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论