存储引擎
- 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 概念介绍
-
MySQL数据库中的组件,负责执行实际的数据I/O操作
-
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
1.2 常用存储引擎
常用存储引擎:InnoDB、MyISAM
MyISAM:
不支持事务和外键约束,占用资源较小,访问速度快,表级锁定,支持全文索引,适用于不需要事务处理,单独写入或查询的应用场景。
InnoDB:
支持事务处理、外键约束,缓存能力较好,支持行级锁定,读写并发能力较好,5.5版本后支持全文索引,适用于一致性要求高、数据更新频繁的应用场景。
2.MyISAM
2.1 特点介绍
- MylSAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
- 访问速度快,对事务完整性没有要求
- MylSAM适合查询、插入为主的应用
- MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
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 适用生产场景分析
4.企业选择存储引擎依据
索引的支持
- 建立索引在搜索和恢复数据库中的数据时能显著提高性能
- 不同的存储引擎提供不同的制作索引的技术
- 有些存储引擎根本不支持索引
事务处理的支持
- 提高在向表中更新和插入信息期间的可靠性
- 可根据企业业务是否要支持事务选择存储引擎
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;
查看表使用的存储引擎
方法一:
show table status from 库名 where name='表名'\G
方法二:
use 库名;
show create table 表名;
例如:
show table status from gzy where name='clr'\G;
use gzy;
use gzy;
修改存储引擎
(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字段没有索引,会使用全表扫描过滤,这时表上的各个记录都将加上锁。