一、MySQL存储引擎
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
二、MySQL中常用的存储引擎
MyLSAM
1、mysql数据库中的组件,负责执行实际的数据I/O操作
2、mysql系统中,存储系统引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
mylsam特点
1、mylsam不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
2、访问速度够快,对事物完整性没有要求。mylsam适合查询,插入为主的应用
3、mylsam在磁盘上存储成三个文件,文件名和表名都相同
.frm文件存储表结构的定义
数据文件的扩展名为.MYD
索引文件的扩展名是.MYI
4、表锁定结构形式,数据在更新时锁定列表
①数据库在读写过程中相互阻塞
②会在数据写入得过程阻塞用户数据的读取
③也会在数据读取的过程中阻塞用户的数据写入
④数据单独写入或读取,速度过程较快且占用资源相对较少
mylsam支持3中不同的存储格式
静态(固定长度)表
静态表示默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是非常迅速,容易缓存,出现故障容易恢复,缺点是占用的空间通常比动态表多。
动态表
动态表包含可变字段,记录不是固定长度的,这样的存储的优点是占用空间较少,但是频繁地更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表
压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
mylsam使用的生产场景
公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
mylsam存储引擎数据读取都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件性能嫌贵较差
三、InnoDB
1、支持事务,支持4个事务隔离级别MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB
2、读写阻塞与事务隔离级别相关能非常高效的缓存索引和数据表与主键以簇的方式存储支持分区、表空间,类似oracle数据库。支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
3、对硬件资源要求还是比较高的场合,行级锁定,但是全 表扫描仍然会是表级锁定,如update table set a=1 where user like ‘%lic%’;
4、InnoDB 中不保存表的行数,如 select count() from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引。
清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表
查看系统支持的存储引擎
1、show engines;
查看表使用的存储引擎
1、show table status from 库名 where name='表名'\G;
2、show table status from class where name='ban'\G;
1、use 库名;
2、show create table 表名;
3、show create table member;
修改存储引擎
1、use 库名;
2、alter table 表名 engine=MyISAM;
3、alter table member engine=MyISAM;
4、show create table member;
通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
1、退出mysql
2、vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
#新创建的表有效,已经存在的表不会有变更。
systemctl restart mysqld
1、新建一个表
2、create table zhujian(name int(6));
3、show create table zhujian;
通过create table 创建表时指定存储引擎
1、use 库名;
2、create table 表名(字段1 数据类型,...) engine=innodb;
3、create table ban3(id int(3))engine=innodb;
4、show create table ban3;