【数据库三】数据库的存储引擎

存储引擎

  • 1.存储引擎
    • 1.1 概念介绍
    • 1.2 常用存储引擎
  • 2.MyISAM
    • 2.1 特点介绍
    • 2.2 支持的存储格式
    • 2.3 适用的生产场景
  • 3.InnoDB
    • 3.1 特点介绍
    • 3.2 适用生产场景分析
    • 4.企业选择存储引擎依据
  • 5.MyISAM和InnoDB的区别
  • 命令操作

1.存储引擎

1.1 概念介绍

【数据库三】数据库的存储引擎_第1张图片

【数据库三】数据库的存储引擎_第2张图片

  • MySQL数据库中的组件,负责执行实际的数据I/O操作

  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

1.2 常用存储引擎

常用存储引擎:InnoDB、MyISAM

MyISAM: 不支持事务和外键约束,占用资源较小,访问速度快,表级锁定,支持全文索引,适用于不需要事务处理,单独写入或查询的应用场景
InnoDB: 支持事务处理、外键约束,缓存能力较好,支持行级锁定,读写并发能力较好,5.5版本后支持全文索引,适用于一致性要求高、数据更新频繁的应用场景

2.MyISAM

2.1 特点介绍

  • MylSAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
  • 访问速度快,对事务完整性没有要求
  • MylSAM适合查询、插入为主的应用
  • MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
    【数据库三】数据库的存储引擎_第3张图片
    【数据库三】数据库的存储引擎_第4张图片

2.2 支持的存储格式

MyISAM表支持3 种不同的存储格式:
(1)静态(固定长度)表

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

(2)动态表

动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行optimize table语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难

(3)压缩表

压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

2.3 适用的生产场景

  • 公司业务不需要事务的支持
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

3.InnoDB

3.1 特点介绍

  • 支持事务,支持4个事务隔离级别
  • MySQL从5.5.5版本开始,默认的存储引擎为InnoDB
  • 读写阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 对硬件资源要求还是比较高的场合
  • 行级锁定,但是全表扫描仍然会是表级锁定,如
update table set a=1 where user like "%zhang%";
  • InnoDB中不保存表的行数,如select count(*) from table;InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。需要注意的是,当count(*)语句包含where条件 MyISAM也需要扫描整个表.
  • 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立组合索引.
  • 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MylSAM则会重建表

3.2 适用生产场景分析

【数据库三】数据库的存储引擎_第5张图片

4.企业选择存储引擎依据

【数据库三】数据库的存储引擎_第6张图片
索引的支持

  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能
  • 不同的存储引擎提供不同的制作索引的技术
  • 有些存储引擎根本不支持索引

事务处理的支持

  • 提高在向表中更新和插入信息期间的可靠性
  • 可根据企业业务是否要支持事务选择存储引擎

5.MyISAM和InnoDB的区别

区别类型 MyISAM InnoDB
构成上的区别 每个MyISAM在磁客上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存情表定义。数据文件的扩展名为MYD(MYData)。素引文件的扩展名是MY(MYIndex)。 基于磁盘的资源是InnoDB表空问数据文件和它的日志文件,InnoDB表的大小只受限于操作系统文件的大小,一般为 2GB
事务处理上方面 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部睫 (foreign key)等高级数据库功能
select、update、insert、delete操作 如果执行大量的select,MyISAM是更好的选择 1.如果你的数据执行大盘的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 2.delete from table时,InnoDB不会重新建立表,而是一行一行的删除。 3.load table from master操作对InnoDe是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用
对 auto_increment的操作 每表一个auto_increment列的内部处理 MyISAM为INSERT和update操作白动更新这-列这使得auto_increment列更快(至少10%),在序列顶的值被删之后就不能再利用。(当AUTOINCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况).auto_increment值可用alter table或myisamch来重置对于auto_increment类型的字段,InnoDB中必须包含只有该字段的素引,但是在MylSAM表中,可以和其他字段一起建立联合索引,更好和更快的auto_increment处理 如果你为一个表指定auto_increment列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计散器,它被用在为该列赋新值。 自动增长计数器仅被存储在生内存中,而不是存在德盘上 关于该计算器的算法实现,请参考 AUTOINCREMENT列在InnoDB里如何工作
表的县体行数 select count()from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(语句包含 where条件时,两种表的操作是一样的 InnoDB 中不保存表的具体行数,也就是说,执行select count()from table时,InnoDB要扫描一遍整个表来计算有多少行
表锁 提供行锁(lockingonrow level)提供与 Oracle类型一致的不加锁这取(nonocking readin select),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like "%aaa%"

命令操作

查看系统支持的存储引擎

show engines;

【数据库三】数据库的存储引擎_第7张图片

查看表使用的存储引擎

方法一:

show table status from 库名 where name='表名'\G

方法二:

use 库名;
show create table 表名;

例如:

show table status from gzy where name='clr'\G;

use gzy;
use gzy;

【数据库三】数据库的存储引擎_第8张图片
【数据库三】数据库的存储引擎_第9张图片

修改存储引擎

(1) 通过alter table修改

use 库名;
alter table 表名 engine=MyISAM;

例如:

alter table clr engine=MyISAM;

(2) 通过修改/etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf

......
[mysqld]
......
default-storage-engine=INNODB

systemctl restart mysql.service

注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

(3) 通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;

//InnoDB行锁与索引的关系
InnoDB行锁是通过给索引项加锁来实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录加锁。

1)
delete from t1 where id=1;
如果id字段是主键,innodb对于主键使用了聚簇索引,会直接锁住整行记录。

2)
delete from t1 where name=‘aaa’;
如果name字段是普通索引,会先锁住索引的两行,接着会锁住相应主键对应的记录。

3)
delete from t1 where age=23;
如果age字段没有索引,会使用全表扫描过滤,这时表上的各个记录都将加上锁。

你可能感兴趣的:(数据库,云计算,运维)