mysql 存储引擎

1.什么是存储引擎

相当于mysql内置的文件系统。

与Linux中的文件系统打交道的层次结构。

2.mysql 存储引擎种类 

oracle Mysql 

可以不同的表,设定不同的存储引擎.

列举mysql中支持的存储引擎种类 

innodb mysql 5.5以后默认的存储引擎

myisam 

csv 

memory

其他分支

percona : XtraDB

MariaDB :Innodb 

其他的引擎:

TokuDB ,MyRocks

1.高压缩比,25倍.

2.update和delele 性能更高

适合与业务中有大量插入和删除操作的场景.

应用于数据量较大的业务。


项目:搭建zabixx和percon  TokuDB引擎

自己完成.

Innodb  :核心特性

介绍 

MVCC 多版本并发控制 

Clustered index 聚簇索引 

多缓冲区池 

事物 

行级锁

外键 

更多复制特性

支持热备

支持自动故障恢复

Change buffer

自适应hash索引:AHI

Innodb和Myisam区别。

查看默认存储引擎:

select @@default_storage_engine;

设置会话的存储引擎:

set  default_storage_engine=myisam;

设置全局的存储引擎(新登陆的所有会话):

set  global  default_storage_engine=myisam;

重启之后,会话和全局的都会失效。

如果要永久生效:

写入配置文件:

vim /etc/my/cnf 

[mysqld]

default_storage_engine=innodb

存储引擎是表级别的,建议每个创建表时可以指定不同的

存储引擎,但是我们建议统一设置为innodb。

4.show 查看表的存储引擎

show create table 表名 \G;

show table status like '%模糊表名%'\G;

4.4 通过information_schema 确认每个表的存储引擎

select * from information_schema.tables \G;

4.5修改一个表的存储引擎(需要在业务不繁忙的时候)

alter table 表名  engine=innodb

或者

alter table 表名  engine innodb;

4.6处理存储引擎的碎片

查看碎片:

 tables表的data_free字段

select table_schema,table_name,data_free from information_schema.tables;

整理碎片:alter table world.test1 engine innodb;

处理数据量较大表的碎片处理

1.导出数据,删除表,在导入表;(早期处理方式)

2.对表进行按月或者按日进行分表(partition,中间件)或者归档表(pt-archive这个工具)

业务替换为truncate 方式

4.7扩展,如何批量修改存储引擎。

select concat('alter table ',table_schema,'.',table_name,' engine=innodb;')

from information_schema.tables info outfile '/tmp/my.sql'

4.8 批量修改非innodb引擎 

select concat('alter table ',table_schema,'.',table_name,' engine=innodb;'),engine

from information_schema.tables 

where engine !='innodb'

 info outfile '/tmp/my.sql'

mysql存储引擎体系结构

宏观结构

myisam 

myt.frm 数据字典信息(列的定义和属性)

myt.myd 数据行

myt.myi 索引信息

innodb 

.frm   数据字典信息(列的定义和属性)

.ibd(独立表空间) 数据行和索引信息

ibdata1(共享表空间):数据字典信息,doube write change buffer undolog(事物回滚日志)  

说明:不同版本的ibdata1中存储的数据是不一样的

5.5:ibdata1中 还会存储ibtemp临时表空间+用户数据(数据行和索引数据)

5.6 ibdata1中 还会存储ibtemp临时表空间

8.0 ibdata1 数据字典取消存储 undo也独立 

可以认为mysql把很多关键的东西独立出来了

ib_logfile0~ib_logfineN:事物重做日志(redo log)

ibtmp1:临时表空间文件(排序,分组,备份,多表查询可能会使用)

ib_buffer_pool:正常关闭数据库存储缓存里面的热数据,存储数据叶是连续的,为顺序IO,减少随机IO;

innnodb 表 仅仅拷贝frm文件和ibd文件到新的数据库,是无法使用的.

Innodb 微观结构

磁盘

1)表空间

1.什么是表空间?

表空间概念是引入oracle数据库。起初是解决扩展,

mysql5.5引入了共享表空间。

2.mysql表空间类型

共享表空间:

5.5引入共享表空间(ibdata1)

用来存储:系统数据,日志,临时表,用户数据和索引

独立表空间:5.6引入独立表空间,单表单表空间。

普通表空间:5.7引入普通表空间,完全和oracle一直的表空间管理模式,可以指定表空间

的创建和分配.

undo表空间:存储undo long  回滚日志

临时表空间:存储临时表 5.7独立

3.表空间管理

用户数据默认的存储方式是独立表空间。独立表空间和共享表空间是可以

互相切换的。

--查看默认表空间模式

select @@innodb_file_per_table;

说明:1代表独立表空间模式

           0代表共享表空间模式

---如何切换

set global innodb_file_per_table=1;

只影响重新登陆会话;只影响新创建的表

test3是我们重新创建的表,可以看到只有数据字典文件,而没有

独立的idb文件,也就没有了独立表空间

如何永久切换  my.cnf 里面指定

vi /etc/my.cnf 

[mysqld]

 innodb_file_per_table=1



下面是表空间物理结构图:


如何扩展共享表空间的大小和个数?

查询:select  @@innodb_data_file_path ;

初始化之前,需要在my.cnf 加入以下配置即可:
innodb_data_file_path=ibdata1:1G;ibdata2:1G:autoextend

方法2:在已运行的数据库上扩展多个ibdata文件

错误的方式:(可以看出默认自增长是一次加64M)

innodb_data_file_path=ibdata1:128M;ibdata2:100M;ibdata3:100M:autoextend

修改后重启数据库,data/3306下的主机名.err错误日志文件报错,提示当前ibdata数据文件大小错误,

应当设置为当前文件的物理真实大小。

InnoDB: The innodb_system data file './ibdata1' is of a different size 4864 pages (rounded down to MB) than the 768 pages specified in the .cnf file!

进行my.cnf重新设置

innodb_data_file_path=ibdata1:76M;ibdata2:100M;ibdata3:100M:autoextend

如果3个文件使用完毕,会自动扩展最后一个。

(2)段  区 页  

表  -》表空间-》段 =》多个区(1M)=》连续的页(16k)=》连续的块(4k)=》连续的扇 (512b) 

事物日志:

redo log 重做日志:

文件位置:/data/3306/ib_logfile0~ib_logfile1....ib_logfileN

控制参数:

select variables like '%%innodb_log_file_size%';

innodb_log_file_size=5033323 设置文件大小

innodb_log_files_in_group=2 设置文件个数

innodb_log_group_home_dir=./  设置存储位置

3)功能:

用来存储,mysql在 insert update delete (DML)操作时数据页的变化过程以及版本号(LSN)。

默认两个文件存储redo,是循环覆盖使用的


undo logs  回滚日志

1)文件位置 

5.7版本(默认位置)

 一部分:ibdataN

一部分:ibtmp1 

2)控制参数

show variables like '%undo%';

innodb_rollback_segments=128 回滚段的个数

3)功能

用来存储回滚日志,可以理解每种操作的反操作

1.使用快照,提供Innodb多版本读写

2.通过记录的反操作,提供回滚功能。


内存

数据内存区域:

1.共享内存区域

buffer_pool  缓冲区池:

参数:innodb_buffer_pool_size: 

select @@innodb_buffer_pool_size;

功能:

缓冲数据页  + 索引页 


会话内存区域

join_buffer_size 

key_buffer_size 

read_rnd_buffer_size

sort_buffer_size 


日志 缓冲区域

innodb_log_buffer_size 

功能:负责redo日志的缓冲


mysql总共使用内存= 共享内存 + 会话内存 + 会话个数 + 

额外的内存使用(文件系统缓存)










 

你可能感兴趣的:(mysql 存储引擎)