MySQL(五)存储引擎

目录

前言

一、存储引擎概念介绍

1、企业选择存储引擎依据

二、MyISAM介绍

1、MyISAM的特点

2、MyISAM在磁盘上存储成三个文件

3、MyISAM 表支持 3 种不同的存储格式

4、MyISAM适用的生产场景

三、Innodb介绍

1、Innodb特点

2、Innodb 在磁盘上存储成三个文件

3、Innodb适用生产场景

四、查看和修改存储引擎的方法

1、查看存储引擎

 2、修改存储引擎

五、innodb 和 myisam 的区别

总结


前言

       存储引擎的实质就是如何实现存储数据,未存储的数据建立索引以及查询、更改、删除等技术

实现的方法。MySQL数据库不同于其它很多数据库系统仅支持选择一种类型的数据存储方式,它

能支持多种不同的数据引擎,可以根据具体的需求,针对每个表使用不同的数据引擎。

一、存储引擎概念介绍

        MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引

技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为

存储引擎。

        存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。是MySQL数据库中的

组件,负责执行实际的数据I/O操作;MySQL系统中,存储引擎处于文件系统之上,在数据保存到

数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。MySQL常用的存

储引擎:MyISAM、InnoDB。

1、企业选择存储引擎依据

◆需要考虑每个存储引擎提供的核心功能及应用场景。

◆支持的字段和数据类型:①、所有引|擎都支持通用的数据类型;②、但不是所有的引|擎都支持其

它的字段类型,如二进制对象。

◆锁定类型:不同的存储引擎支持不同级别的锁定:表锁定MyISAM和行锁定Innodb。

◆索引的支持:建立索引、在搜索和恢复数据库中的数据时能显著提高性能;不同的存储弓|擎提供

不同的制作索引的技术;有些存储弓|擎根本不支持索引。

◆事务处理的支持:提高在向表中更新和插入信息期间的可靠性;可根据企业业务是否要支持事务

选择存储引擎。

二、MyISAM介绍

        MyISAM存储引擎是MySQL关系型数据库5.5版本之前默认的存储引擎,前身是ISAM;ISAM

是一个定义明确且经历时间考验的数据表格管理办法,在设计之时就考虑到数据库被查询的次数要

远大于更新的次数。

1、MyISAM的特点

◆MyISAM管理非事务表,是ISAM的扩展格式。MyISAM不支持事务,也不支持外键。

◆访问速度快。数据单独写入或读取,速度过程较快且占用资源相对少,MyISAM提供高速存储和

索引,以及全文搜索能力,受到web开发的青睐。

◆对事物完整性没有要求。

◆提供ISAM表里没有的索引和字段管理的大量功能。

◆MyISAM使用一种表格锁定的机制,数据在更新时锁定整个表(不允许两个人同时操作),以优

化多个并发的读写操作。

◆数据库在读写过程中相互阻塞。会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过

程中阻塞用户的数据写入。

2、MyISAM在磁盘上存储成三个文件

.frm 文件存储表结构的定义;

数据文件的扩展名为 .MYD (MYData);

索引文件的扩展名是 .MYI (MYIndex)。

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

(frm,myd,myi)。 每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储,也就是说

不管这个表有多少个索引,都是存放在同一个.MYI 文件中。

①、MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个

“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。

②、“.MYI”文件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。对于

MyISAM 存储来说,可以被 cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM 表对应一

个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

3、MyISAM 表支持 3 种不同的存储格式

静态(固定长度)表

①、静态表:是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度

的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常

比动态表多。

②、动态表:动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是

频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令

来改善性能,并且出现故障的时候恢复相对比较困难。

③、压缩表:压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩

的,所以只有非常小的访问开支。

4、MyISAM适用的生产场景

公司业务不需要事务的支持;

单方面读取或写入数据比较多的业务;

MyISAM存储引擎数据读写都比较频繁场景不适合;

使用读写并发访问相对较低的业务;

数据修改相对较少的业务;

对数据业务一致性要求不是非常高的业务;

服务器硬件资源相对比较差。

三、Innodb介绍

1、Innodb特点

 支持事务:支持4个事务隔离级别;

 行级锁定,但是全表扫描仍然会是表级锁定;

 读写阻塞与事务隔离级别相关;

 具有非常高效的缓存属性:能缓存索引,也能缓存数据;

 表与主键以簇的方式存储;

 支持分区、表空间,类似oracle数据库;

 支持外键约束,5.5以前不支持全文索引,5.5以后的版本支持全文索引;

 对硬件资源要求比较高。

       注:因MyISAM注重读,而Innodb注重写的功能,因此在表级锁定进行相关搜索的时候还是有

差异的。例:update table set a=1 where user like ‘%liu%’;

        Innodb是不会保存表的行数的,因此,使用‘select count(*) from table;’时,需要扫描一遍整表

来计算有多少行。但是MyISAM只需要进行的读出保存好的行数即可。当count(*)语句包含where语

句时,MyISAM也需要扫描整表。对于自增长的字段,Innodb中必须包含只有该字段的索引,但是

在MyISAM表中可以和其他字段一起建立组合索引,清空整表时,Innodb时逐行删除,效率较低。

MyISAM是直接重建表。

2、Innodb 在磁盘上存储成三个文件

db.opt(表属性文件)

表名.frm(表结构文件)

表名.ibd(表数据元数据)

        另外还有“.ibd”和 ibdata 文件,这两种文件都是用来存放 Innodb 数据的,之所以有两种文件

来存放 Innodb 的数据(包括索引),是因为Innodb的数据存储方式能够通过配置来决定是使用共

享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储 方式使用“.ibd”文件来存

放数据,且每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表

空间来存放数据,则会使用 ibdata  文件来存放,所有表共同使用一个(或者多个,可自行配置)

ibdata 文件。

3、Innodb适用生产场景

业务需要事务的支持;

行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成;

业务数据更新较为频繁的场景,如:论坛、微博等;

业务数据一致性要求较高,如:银行业务;

硬件设备内存较大(因为事务都先放内存),利用innodb较好的缓存能力来提高内存利用率,减少

磁盘IO的压力。

四、查看和修改存储引擎的方法

1、查看存储引擎

show engines;   #查看系统支持的存储引擎
show table status from 库名 where name='表名'\G;  #查看某个表使用的存储引擎(一)
show create table 库名.表名;   #查看某个表使用的存储引擎(二)
#两种方法都可以查看表所使用的引擎信息

MySQL(五)存储引擎_第1张图片

 MySQL(五)存储引擎_第2张图片

 2、修改存储引擎

方法1:
alter table修改
alter table table_ name engine=引擎;
方法2: 
修改my.cnf配置文件,指定默认存储引擎并重启服务
default-storage-engine=InnoDB
方法3:
create table创建表时指定存储引擎
create table表名(字段) engine=引擎
如:create table engine Test(id int) engine=MyISAM;
方法4:
mysql_ convert_table_ format 转化存储引擎
yum install perl-BDI perl-DBD-MySQL -y  #
mysql_convert_table_format –user=root --password=密码 --socket=/temp/mysql.sock --engine=引擎 库名 表名
如
[root@Mysq|1 /]# yum install perl-DBI perl-DBD-MySQL -y
[root@Mysq|1 /]# /usrlocal/mysql/bin/mysql_ convert _table_ format -
user=root --password='123' --sock=/tmp/mysql.sock auth

五、innodb 和 myisam 的区别

1、注重方向:myisam 更注重于读,而 innodb 注重于写;

2、搜索/访问速度:myisam > innodb;

3、innodb支持事务,支持4个事务隔离级别(数据不一致问题),myisam不支持事务;

4、完整性:myisam对完整性无要求(不支持事务,ACID特点),innodb具有很好的完整性(支持事务,ACID特点);

5、安全性:innodb>myisam。(因完整性有所区别,所以安全性也有所区别,在遇到事故时,innodb比myisam恢复起来容易);

6、锁级别:myisam为表级锁定,innodb为行级锁定(全表扫描仍是表级锁定);

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

7、抗并发能力:myisam容纳并发力差,innodb容纳高并发能力较好;

8、对于硬件要求:myisam对硬件要求不是很高,innodb对于硬件要求较高。

对比与这些区别,所用的场景也有所不同,例如:

1、innodb适用于如微博、论坛等读写较多且更新频繁的场景;

2、myisam适用于如资料档案室、商品仓库等数据修改较少、以读为主并且不支持事务的场景。

总结

myisam适合在无事物要求,读写并发少的场景使用。

innodb适合在有事务要求,读写并发多的场景使用。

MySQL存储引擎是MySQL数据库服务器中的一个重要组件,负责为数据库执行实际的数据I/O操

作。

修改存储引擎有多种方式,可以根据当前数据库的状态使用不同的方式。

 

你可能感兴趣的:(MySQL,mysql)