首页 > 代码库 > 九爷 带你玩转mysql引擎Mylsam

九爷 带你玩转mysql引擎Mylsam

一、 mysql存储引擎介绍:


MySQL5.1(不包括)之前的版本中,存储引擎是需要在MySQL 安装的时候就必须和MySQL 一起被编译并同时被安装的。

但是从MySQL5.1 开始,MySQL AB 对其结构体系做了较大的改造,并引入了一个新的概念:插件式存储引擎体系结构。 MySQL AB 在架构改造的时候,让存储引擎层和sql layer各自更为独立,耦合更小,甚至可以做到在线加载新的存储引擎,也就是完全可以将一个新的存储引擎加载到一个正在运行的MySQL 中,而不影响MySQL 的正常运行。插件式存储引擎的架构,为存储引擎的加载和移出更为灵活方便,也使自行开发存储引擎更为方便简单。


MySQL的插件式存储引擎主要包括MyISAMInnodbNDB ClusterMariaFalconMemoryArchive等,其中最著名而且使用最为广泛的MyISAM Innodb两种存储引擎。MyISAM MySQL 最早的ISAM 存储引擎的升级版本,也是MySQL 默认的存储引擎。而Innodb 实际上并不是MySQ 公司的,而是第三方软件公司Innobase(在2005 年被Oracle 公司所收购)所开发,其最大的特点是提供了事务控制等特性, 所以使用者也非常广泛


       二、MyISAM 存储引擎简介:


1mysql5.1之前默认存储引擎。

2MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件。

首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm 文件,另外还有.MYD.MYI 文件,分别存放了表的数据(.MYD)和索引数据(.MYI)。每个表都有且仅有这样三个文件做为MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。

 

3MyISAM 支持以下三种类型的索引:

B-Tree 索引

B-Tree 索引,就是所有的索引节点都按照balance tree 的数据结构来存储,所有的索引数据节点都在叶节点。

R-Tree 索引

R-Tree 索引的存储方式和b-tree 索引有一些区别,主要设计用于为存储空间和多维数据的字段做索引,所以目前的MySQL 版本来说,也仅支持geometry 类型的字段作索引

Full-text 索引

Full-text 索引就是全文索引,他的存储结构也是b-tree主要是为了解决在我们需要用like 查询的低效问题。

MyISAM 上面三种索引类型中,最经常使用的就是B-Tree 索引了,偶尔会使用到Fulltext,但是R-Tree 索引一般系统中都是很少用到的。另外MyISAM B-Tree 索引有一个较大的限制,那就是参与一个索引的所有字段的长度之和不能超过1000 字节。

1、不支持事务

2、只有表锁

3、如下情况会造成表损坏:


Mysqld正在写入该表时,被kill


主机宕机(Crash


磁盘硬件故障


MyISAM存储引擎的bug


虽然每一个MyISAM的表都是存放在一个相同后缀名的.MYD 文件中,但是每个文件的存放格式实际上可能并不是完全一样的,因为MyISAM 的数据存放格式是分为静态(FIXED)固定长度、动态(DYNAMIC)可变长度以及压缩(COMPRESSED)这三种格式。

当然三种格式中是否压缩是完全可以任由自己选择的,可以在创建表的时候通过ROW_FORMAT 来指定{COMPRESSED | DEFAULT},也可以通过myisampack 具来进行压缩,默认是不压缩的。


而在非压缩的情况下,是静态还是动态,就和我们表中个字段的定义相关了。只要表中有可变长度类型的字段存在,那么该表就肯定是DYNAMIC 格式的,如果没有任何可变长度的字段,则为FIXED 格式,当然,你也可以通过alter table 命令,强行将一个带有VARCHAR 类型字段的DYNAMIC 的表转换为FIXED,但是所带来的结果是原VARCHAR 字段类型会被自动转换成CHAR 类型。相反如果将FIXED 转换为DYNAMIC,也会将CHAR 类型字段转换为VARCHAR 类型,

知识点扩展:如何根据表的记录数量估算占用的磁盘空间

首先先算一个表中一行有多少个字节。

然后根据数据库中的表每天增加多少行记录,就能够算出每天要增加多少硬盘空间,这样就可根据数据量估算规划多大的空间。


例如在数据库test中创建一张tb1

技术分享 

执行mysql>desc  test1.tb1查看tb1的表结构


技术分享 


10个字节+20个字节+2个字节+20字节+8字节+8字节+100个字节=168字节

Tb1表的一个行有118个字节

如果每天增加10000条记录,大约需要10000x168/1024/1024=1.6MB

这样就可以根据每天增加的记录数,合理规划好磁盘空间了


MyISAM 存储引擎的某个表文件出错之后,仅影响到该表,而不会影响到其他表,更不会影响到其他的数据库。如果我们的数据库正在运行过程中发现某个MyISAM 表出现问题了,则可以在线通过check table 命令来尝试校验他,并可以通过repair table 命令来尝试修复。在数据库关闭状态下,我们也可以通过myisamchk 工具来对数据库中某个(或某些)表进行检测或者修复。不过强烈建议不到万不得已不要轻易对表进行修复操作,修复之前尽量做好可能的备份工作,以免带来不必要的后果。


本文出自 “李世龙” 博客,谢绝转载!

九爷 带你玩转mysql引擎Mylsam