当前位置: 首页 > article >正文

MYISAM存储引擎介绍,特性(和innodb对比),优势,物理文件,表存储格式(静态表,动态表,null记录,压缩表)

目录

MYISAM存储引擎

介绍

特性(和innodb对比)

优势

物理文件​编辑

表存储格式

介绍

静态格式表

特点

适用场景

动态格式表

特点

null记录

意义

压缩格式表 


MYISAM存储引擎

介绍

mysql5.5版本之前的默认存储引擎

  • 查询效率极高(支持b+树索引和全文索引) + 表占用空间小(数据压缩) + 免费开源
  • 表级锁,读写并发较差,适用于只读/主要是读

适合 早期开发阶段,数据量不大的时候,查询快且管理简单

  • 不适合大规模数据的事务处理,因为不支持事务,一旦宕机可能会丢失部分数据

在 mysql5.5之后,InnoDB 成为默认存储引擎

  • 因为它支持事务、行锁,并发性能更强,更适合大规模数据管理

特性(和innodb对比)

innodb是在myisam的基础上实现的,继承了它的一些优点,也补足了一些缺点

这里myisam相对innodb来说:

  • 不支持外键/事务/MVCC/哈希索引
  • 最大存储限制 -- 256tb

优势

MyISAM表的最大行数为(2^32)^2 及 (1.844E+19)行
每个MyISAM表最多可以创建64个索引,每个索引最多可以包含16个列

  • 一般一张表中索引设置3-5个就够了
  • 因为索引 本身占据空间 + 写入数据会更新索引结构

支持并发插入
通过create table创建表时,指定DATA DIRECTORY选项INDEX DIRECTORY选项数据文件和索引I文件放在不同设备的不同目录中,从而提高访问速度

  • 数据文件和索引文件分开存放,可以让不同用户分别访问两个文件,互相不影响,减少磁盘 I/O 竞争,从而提高访问效率

BLOBTEXT数据类型的列也可以被索引

  • 可以使用全文索引

在索引列中允许使用NULL值


如果mysqld启动时设置了myisam_recover_options系统变量,那么MylSAM表在打开时进
行会自查,如果上一次表没有正确关闭将会修复


表中VARCHARCHAR列的长度总和最多可达64KB


UNIQUE约束的长度不受限制

物理文件

8.0是.sdi,之前的版本是.frm

  • 两种格式的文件作用相同

表存储格式

介绍

使用myisampack实用工具对MylSAM表进行压缩/解压操作

静态格式表

  • 最简单最安全(不容易损坏)最快的磁盘格式
  • 每行占用的存储空间固定,检索方便,便于计算内存地址
  • 即使数据字段实际长度小于定义的列宽,也会填充到固定长度
特点

  • 每null列额外占用一位,四舍五入到最接近的字节
  • null记录大致应该是这样(手册中没提):
  • 或者在每一列后增加1bit? 有谁懂的能说说吗
适用场景

动态格式表

特点

列类型是字符串

  • 长度<4的字符串列外,所有字符串列都是动态的

每一行都有一个标志指示行有多长

  • 当因更新操作而变得更长时,数据可能存储在不连续的空间
  • 可以使用OPTIMIZE TABLEtable_name语句myisamchk-r对表进行碎片整理

每个允许为NULL的列,都用一个1BIT的额外空间记录当前列是否为空

  • 和静态格式表的一样

每行前面都有一个bitmap(位图)

  • 用来记录包含空字符串或0的列
  • 如果字符串类型的列长度为零,或者数字列的值0,则在位图中标记并且不会保存到磁盘
  • 不包括包含null值的列 (空字符串/0值 和 null值 在mysql中含义不同)

通常磁盘空间占用比固定长度表要少很多

 

null记录

  • 会将允许为空的列位图中某一位关联起来 (从右往左排列)

位图中值的含义:

  • 如果位图中的值为0,表示列值不为空
  • 为1,表示为空 (为空的列不在真实数据行中存在)
意义

对于静态表来说:

  • 即使列值为null,依然也会占用完整存储空间
  • 但可以快速知道哪些列是 NULL(is null查询时有用),并且区分 null值 和 空字符串/0值

对于动态表来说:

  • 虽然null值不会占用空间,但也需要快速判断是否为null                     

 

压缩格式表 

每行都单独压缩,每列都可能用单独的方式进行压缩:

有参考 -- 16.2.3 MyISAM 表存储格式_MySQL 8.0 参考手册


http://www.kler.cn/a/568671.html

相关文章:

  • 动态规划刷题
  • 计算机网络---SYN Blood(洪泛攻击)
  • 【计算机网络基础】-------计算机网络概念
  • ​Java 开发中的String判断空及在多种转换String字符串场景下的判断空
  • Rust学习总结之-枚举
  • Linux--基本指令2
  • 嵌入式开发工程师笔试面试指南-数电基础
  • Vue框架的使用 搭建打包 Vue的安全问题(Xss,源码泄露)
  • postgresql源码学习(60)—— VFD的作用及机制
  • 蓝桥杯备考:DFS之记忆化搜索
  • Spring单例模式 Spring 中的单例 饿汉式加载 懒汉式加载
  • SyntaxError: positional argument follows keyword argument
  • 使用【华为手机】给吉利车机升级安装第三方软件教程【保姆级教程】
  • Nacos 配置共享文件 如何在Nacos配置共享文件
  • 如何编写一个基本的 Makefile
  • 【Docker】使用Docker搭建-MySQL数据库服务
  • 基于PythonPython面向复杂场景的高质量图像合成方法研究
  • 【数据结构】LRUCache|并查集
  • 钉钉小程序(企业内部应用)开发下载预览文件
  • Nginx负载均衡策略详解:从轮询到智能分发,打造高可用服务架构