大家好,我是anyux。本文介绍MySQL存储引擎。

存储引擎
相当于Linux文件系统,只不过比文件系统强大
功能
数据读写
数据安全和一致性
提高性能
热备份
自动故障恢复
高可用方面支持
引擎类别
show engines;
引擎类型如下
CSV
MRG_MYISAM
MyISAM
BLACKHOLE
PERFORMANCE_SCHEMA
MEMORY
ARCHIVE
InnoDB
FEDERATED
必须要了解引擎类型
InnoDB,MyISAM,MEMORY,CSV
MySQL存储引擎从5.5以后默认使用的是InnoDB,从8.0以后就放弃了MyISAM
另外MySQL还支持插件式开发存储引擎。比较出名的存储引擎有RocksDB,MyRocks,TokuDB。这三个存储引擎压缩比较高,数据插入性能高,其他功能与InnoDB无差别,所以比InnoDB优秀,属于第三代存储引擎
PerconaDB使用的是XtraDB
MariaDB:默认使用是InnoDB,MySQL的InnoDB和这个是不一样的

InnoDB存储引擎核心特性说明
| 区别 | InnoDB | MyISAM |
|---|---|---|
| 事务 | 支持 | 不支持 |
| 行锁 | 支持 | 不支持 |
| MVCC | 支持 | 不支持 |
| 外键 | 支持 | 不支持 |
| ACSR自动故障恢复 | 支持 | 不支持 |
| 热备 | 支持 | 不支持 |
| 复制(多线程,GTID,MTS) | 支持 | 不支持 |
存储引擎替换
InnoDB替换MyISAM
环境:CentOS5.8 MySQL5.0版本,MyISAM存储引擎,网站业务(LNMP),数据量50G左右
问题:业务压力大时,非常卡,经历过宕机,会有部分数据丢失
问题分析:
MyISAM存储引擎表级锁,在高并发时,会有很高的锁等待
MyISAM存储引擎不支持事务,在断电时,有可能会丢失数据
监测状态
监控锁的状态,有很多的表锁等待
存储引擎查看:所有表默认是MyISAM
解决方案
升级到MySQL 5.6版本。注意,低版本数据库要先升级到5.5,再升级到5.6。直接升级到5.6会出现服务无法启动的情况
表数据迁移
开启双1安全参数

查看存储引擎
创建表时,如果没有指定存储引擎,则使用默认的存储引擎
打印所有支持的存储引擎
show engines;
查看当前的存储引擎
select @@default_storage_engine;

可以在配置文件中,设置存储引擎
vim /etc/my.cnf
[mysqld]
default_storage_engine=InnoDB
查看自建的所有库表的存储引擎
select table_schema as 数据库, group_concat(concat(" ",table_name,":",engine," ")) as 数据表 from information_schema.tables where table_schema not in('sys','mysql','information_schema','performance_schema') group by table_schema;
存储引擎修改
alter table tmp_db.tmp_student engine=MyISAM;
再修改回InnoDB
alter table tmp_db.tmp_student engine=InnoDB;
查看单表的存储引擎
show create table tmp_db.tmp_student;

整理碎片
在做delete删除操作时,会对表进行逐行删除数据,删除后原来所占用的空间,不会被立即释放,因此产生碎片。
在服务运行期间,这些碎片空间不会被服务回收,因此占用的无效空间相对变大,使用索引时会产生无效索引,进而影响服务的性能。
因此需要整理碎片。让数据行更加紧凑,让查询索引时性能变强。
环境:CentOS7.4,MySQL5.7,InnoDB存储引擎
业务特点:数据量级较大,经常需要按月删除历史数据
问题:磁盘空间占用很大,不释放
最直接的办法是,将表中所有数据导出,删除表,再重新导入到服务中。
这种方法就是有点折腾,而且需要业务停止后才方便操作。如果业务需要24小时运行,那就要使用到第二种方法了
对表进行按月分表(partition,中间件),业务替换为truncate方式,定期进行碎片整理
批量替换存储引擎
select concat("alter table ",table_schema,".",table_name," engine=toukudb;") as 批量替换语句 from information_schema.tables where table_schema='zabbix';可以将这些语句,重定向到文件,使用shell脚本执行

MyISAM由三个文件构成,FRM,FYD,MYI。FRM用来存储表结构,FYD用来存储数据行,MYI用来存储索引




