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总共使用内存= 共享内存 + 会话内存 + 会话个数 +
额外的内存使用(文件系统缓存)