mysql的存储引擎

在文件系统中,mysql将每个数据库保存为数据目录下的一个子目录。创建表时,mysql会在数据库子录下创建一个和表同名的.frm文件保存表的定义。因为mysql使用文件系统的目录和文件夹来保存数据库和表的定义。大小写敏感性和具体的平台密切相关。在windows中,大小写是不敏感的。不同的存储引擎保存数据和索引的方式是不同的。但表的定义是在mysql服务层统一处理的。

使用SHOW TABLE STATUS命令显示表的相关的信息。将mysql添加到系统路径下
1.mysql -u root -p
2.enter password:****
3.show table status like ‘user’;
在dos命令下:mysql的存储引擎_第1张图片
输出结果表明,这是一个myisam表。输出中还有很多其他信息以及统计信息。下面简单介绍下。
Name:表名
Engine:表的存储引擎类型,在旧版本中,该列的名字叫Type,而不是Engine。
Row_format:行的格式,对于myisam表,可选的值为Dynamic,Fixed或者Compressed。Dynamic的行长度,一般包含可变长度的字段,如VARCHAR或BLOB。FIXED的行长度则是固定的,是、只包含固定长度的列。如char和INTEGER。Compredded的行则只在压缩表中存在。
Row:表中的行数。对于MyISAM和其他一些粗出引擎,该值是精确的,但对于InnoDB,该值是估计值。
Avg_row_length:平均每行包含的字节数
Data_length:表数据的大小(以字节为单位)
Max_data_length:表数据的最大容量,该值和存储引擎有关。
Index_length:索引的大小
Data_free:对于MyISAM表,表示已分配但目前没有使用的空间。这部分空间包括了之前删除的行,以及后继可以被INSERT利用到的空间。
Auto_increment:下一个AUTO_INCREMENT的值。
Create_time:表的创建时间
Update_time:表的最后修改时间。
Check_time:使用CKECK TABLE 命令或者myisamchk工具最后一次检查表的时间。
Collation:表的默认字符集合字符列排序规则。
Checksum:如果启用,保存的是整个表的实时效验和。
Create_options:创建表时指定的其他选项。
Comment:对于MyISAM表,保存的是表在创建时带的注释。对于InnoDB表,则保存的是InnoDB表空间的剩余空间信息。如果是一个视图,则该列包含‘VIEW’的文本字样。

InnoDB存储引擎

InnoDB是MYsql的默认事务型引擎,也是最重要,使用最广泛的存储引擎。他被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。InnoDB的性能和自动崩溃恢复特性,使得他在非事务型存储的需求中国也很流行。除非有非常特别的原因需要使用其他的存储引擎。否则应该优先考虑InnoDB引擎,如果要学习存储引擎,InnoDB也是一个非常好的值得花最多的时间去深入学习的对象,收益肯定比将时间花在每个存储引擎的学习上要高的多。

InnoDB的历史

2008年,发布了所谓的InnoDB plugin,适用于Mysql 5.1版本,但这是Oracle创建的下一代InnoDB引擎,其拥有者是InnoDB,而不是Mysql。Mysql默认还是选择了集成旧的InnoDB引擎。当然用户可以自行选择使用新的性能更好,扩展性更佳的InnoDB plugin来覆盖旧的版本。直到最后,在Oracle收购了Sun公司后发布了Mysql 5.5中才彻底使用InnoDB plugin替代了旧版本的InnoDB。

InnoDB是一个很重要的存储引擎,很多个人和公司都对其贡献代码。而不是Oracle公司的开发团队。在过去的几年间,InnoDB的改进速度大大加快,主要的改进集中在可测量性,可扩展性,可配置化,性能,各种新特性和对windows的支持等方面。

为改善InnoDB的性能,Oracle投入了大量的资源,并做了很多卓有成效的工作。在超过四核CPU的系统中InnoDB表现不佳,而现在已经可以很好地扩展至24核的系统。甚至在某些场景,32核或者更多核的系统中也表现良好。

InnoDB概述

InnoDB的数据存储在表的表空间,表空间是由InnoDB管理的一个黑盒子。由一系列的数据文件组成。在mysql4.1以后的版本中,InnoDB可以将每个表的数据和索引放在单独的文件中,InnoDB也可以使用裸设备作为表空间的存储介质,但现代的文件系统使得裸设备不再是必要的选择。

InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

InnoDB表是基于聚簇索引建立的,InnoDB的索引结构和Mysql的其他存储引擎有很大的不同,聚簇索引对主键查询有很高的性能。不过它的二级索引(非主键索引)中必须包括主键列,所以如果主键列很大的话,其他的所有索引都会很大。因此,若表上的索引较多的话,主键应当尽可能的小。InnoDB的存储格式是平台独立的。也就是说可以将数据和索引文件从Intel平台复制到PowerPC或者Sun SPARC平台。

InnoDb内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在内存中创建hash索引加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区等。

作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份,Oracle提供的Mysql Enterprise Backup,Percona提供的开源的XtraBackup都可以做到这一点。Mysql的其他存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

MyISAM存储引擎

在Mysql5.1及以前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引,压缩,空间函数(GIS)等,但MyISAM不支持事务和行级索,而且有一个毫无疑问的缺陷就是奔溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使Mysql事务已经很长时间了,在很多人的概念中Mysql还是非事务型的数据库。尽管MyISAM引擎不支持事务,不支持崩溃后的安全恢复,但它绝不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以继续使用MyISAM(但请不要默认使用MyISAM,而是应当默认使用InnoDB)

存储

MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。MyISAM表可以包含动态或者静态行。MyISAM表可以存储的行记录数,一般受限于可用的磁盘空间,或者操作系统中单个文件的最大尺寸。

在Mysql5.0中,MyISAM表如果是变长行,则默认配置只能处理256TB的数据,因为指向数据记录得指针长度是6个字节。而在更早的版本中,指针长度默认是4字节,所以只能处理4GB的数据。而所有的Mysql版本都支持8字节的指针。要改变MyISAM表指针的长度(增高或者调低),可以通过修改表的MAX_ROWs和AVG_ROW_LENGTH选项的值来是实现,两者相乘就是表可能达到的最大大小。修改这两个参数会导致重建整个表和表的所有索引,这可能需要很长的时间才能完成。

MsISAM特性

作为Mysql最早的存储引擎之一,MyISAM有一些已经开发出来很多年的特性,可以满足用户的实际需求。

加锁与并发
MyISAM对整张表加锁,而不是针对行,读取时会对需要督导的所有表家共享锁,写入时则对表 加排他锁。但是在表有读取查询的同时,也可以往表中插入新的记录(这被称为并发插入, CONCURRENT INSERT)。
修复
对于MyISAM表,Mysql可以手工或者自动执行检查和修复操作,但这里说的修复和事务恢复是非 常慢的。可以通过CHECK TABLE mytable检查表的错误,如果有错误可以通过执行REPAIR TABLE mytable 进行修复。另外,如果MySQL服务器已经关闭,也可以通过myisamchk命令行工 具进行检查和修复操作。
索引特性
对于MyISAM表,即使是BLOB和TEXT等长字段,也可以基于其前500个字符创建索引。MyISAM 也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。
延迟更新索引建
创建表MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会 立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭 表的时候才会将对应的索引块写入到磁盘。这种方式可以极大地提升写入性能,但是在数据库或 者主机崩溃时会造成索引损坏,需要执行修复操作。延迟更新索引键的特性,可以在全局设置, 也可以为单个表设置。

MyISAM压缩表

如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表或许适合采用MyISAM压缩表。可以使用misampack对MyISAM表进行压缩(也叫打包pack)。压缩表是不能进行修改的(除非先将表解除压缩,修改数据,然后再次压缩)。压缩表可以极大的减少磁盘空间占用,因此也可以减少磁盘I/O,从而提升查询性能、。压缩表也支持索引,但索引也是只读的。

以现在的硬件能力,对大多数应用场景,读取压缩表数据时的解压带来的开销影响并不大,而减少I/O带来的好处则要大的多。压缩时表中的记录是独立压缩的,所以读取单行的时候不需要去解压整个表(甚至也不解压行所在的整个页面)。

MyISAM性能

MyISAM引擎设置简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MyISAM最典型的性能问题还是表锁的问题,如果你发现所有的查询都长期处于"Locked"状态,那么毫无疑问表锁就是罪魁祸首。

你可能感兴趣的:(mysql数据库)