Mysql 存储引擎

1.什么是存储引擎

相当于系统的文件系统

2.存储引擎分类

InnoDB

MyISAM

MEMORY

CSV

2.1 查看引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
 Engine  Support  Comment  Transactions  XA  Savepoints 
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
 MEMORY  YES  Hash based, stored in memory, useful for temporary tables  NO  NO  NO 
 CSV  YES  CSV storage engine  NO  NO  NO 
 MRG\_MYISAM  YES  Collection of identical MyISAM tables  NO  NO  NO 
 BLACKHOLE  YES  /dev/null storage engine (anything you write to it disappears)  NO  NO  NO 
 InnoDB  DEFAULT  Supports transactions, row-level locking, and foreign keys  YES  YES  YES 
 PERFORMANCE\_SCHEMA  YES  Performance Schema  NO  NO  NO 
 ARCHIVE  YES  Archive storage engine  NO  NO  NO 
 MyISAM  YES  MyISAM storage engine  NO  NO  NO 
 FEDERATED  NO  Federated MySQL storage engine  NULL  NULL  NULL 
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

存储引擎是作用在表上的,也就意味着,不同的表可以有不同的存储引擎类型。

PerconaDB:默认是XtraDB

MariaDB:默认是InnoDB

其他的存储引擎支持:

TokuDB

RocksDB

MyRocks

以上三种存储引擎的共同点:压缩比较高,数据插入性能极高 现在很多的NewSQL,使用比较多的功能特性.

3.InnoDB介绍

mysql5.5之后默认引擎为InnoDB

InnoDB优点

1、事务(Transaction)
2、MVCC(Multi-Version Concurrency Control多版本并发控制)
3、行级锁(Row-level Lock)
4、ACSR(Auto Crash Safey Recovery)自动的故障安全恢复
5、支持热备份(Hot Backup)
6、Replication: Group Commit , GTID (Global Transaction ID) ,多线程(Multi-Threads-SQL ) 

查看默认的存储引擎

mysql> SELECT @@default_storage_engine;
+--------------------------+
 @@default_storage_engine 
+--------------------------+
 InnoDB 
+--------------------------+
1 row in set (0.00 sec)

修改默认存储引擎

会话级别:
set default_storage_engine=myisam;
全局级别(仅影响新会话):
set global default_storage_engine=myisam;
重启之后,所有参数均失效.
如果要永久生效:
写入配置文件
vim /etc/my.cnf
[mysqld]
default_storage_engine=myisam
存储引擎是表级别的,每个表创建时可以指定不同的存储引擎,但是我们建议统一为innodb.

查看所有除系统表的存储引擎

mysql> select table_schema,table_name ,engine from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema');
+--------------+------------+--------+
 table_schema  table_name  engine 
+--------------+------------+--------+
 school  score  InnoDB 
 school  student  InnoDB 
+--------------+------------+--------+
2 rows in set (0.00 sec)

修改一个表的存储引擎 比如t1表

alter table t1 engine innodb;

批量修改一个库下多个表的存储引擎,比如zabbix

select concat("alter table zabbix.",table_name," engine tokudb;") from
information_schema.tables where table_schema='zabbix' into outfile '/tmp/tokudb.sql';

InnoDB的物理储存结构

ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据
ib_logfile0 ~ ib\_logfile1: REDO日志文件,事务日志文件。
ibtmp1: 临时表空间磁盘位置,存储临时表
frm:存储表的列信息
ibd:表的数据行和索引

修改共享表空间

共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)

[(none)]>select @@innodb_data_file_path;
[(none)]>show variables like '%extend%';
innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend
innodb_autoextend_increment=64

独立表空间

从5.6,默认表空间不再使用共享表空间,替换为独立表空间。

主要存储的是用户数据

存储特点为:一个表一个ibd文件,存储数据行和索引信息

基本表结构元数据存储:

xxx.frm

最终结论:
元数据 数据行+索引

mysql表数据 =(ibdataX+frm)+ibd(段、区、页)
DDL DML+DQL

MySQL的存储引擎日志:
+ Redo Log: ib_logfile0 ib_logfile1,重做日志
+ Undo Log: ibdata1 ibdata2(存储在共享表空间中),回滚日志
+ 临时表:ibtmp1,在做join union操作产生临时数据,用完就自动

独立表空间设置

查看 1代表就是使用的独立表空间

mysql> select @@innodb_file_per_table;
+-------------------------+
 @@innodb_file_per_table 
+-------------------------+
 1 
+-------------------------+
1 row in set (0.00 sec)

删除和导入表空间

alter table table_name dicard tablespace;
alter table table_name import tablespace;

上面这两条语句主要用于数据库表空间丢失的处理

比如宕机造成数据库无法启动 ,我们需要新搭建一套数据库环境  创建原来的表  然后执行dicard  tablespace删除我们自己创建的表空间 ,把故障机器的表空间文件frm复制过来 重新import tablespace  就可以恢复数据

缓存区池

查询

select @@innodb_buffer_pool_size;
show engine innodb status \G
innodb_buffer_pool_size

一般建议最多是物理内存的 75-80%

双一

innodb_flush_log_at_trx_commit

主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。
select @@innodb_flush_log_at_trx_commit;

1,每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;flush 到操作系统的文件系统缓存 fsync到物理磁盘.

0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入文件系统缓存并且秒fsync磁盘一次;

2,每次事务提交引起写入文件系统缓存,但每秒钟完成一次fsync磁盘操作。

Innodb_flush_method=(O_DIRECT, fdatasync)

控制的是,log buffer 和data buffer,刷写磁盘的时候是否经过文件系统缓存
show variables like ‘%innodb_flush%’;

O_DIRECT :数据缓冲区写磁盘,不走OS buffer

fsync :日志和数据缓冲区写磁盘,都走OS buffer

O_DSYNC :日志缓冲区写磁盘,不走 OS buffer

使用建议

最高安全模式
innodb_flush_log_at_trx_commit=1
Innodb_flush_method=O_DIRECT
最高性能:
innodb_flush_log_at_trx_commit=0
Innodb_flush_method=fsync

redo日志有关的参数

innodb_log_buffer_size=16777216
innodb_log_file_size=50331648
innodb_log_files_in_group = 3

Mysql 存储引擎
http://www.jcwit.com/article/63/
作者
Carlos
发布于
2019年6月11日
许可协议