MySQL-存储引擎

1、简介

类型Linux中的文件系统,比文件系统要高级

2、mysql中的存储引擎类型

InnoDB(5.5以后的默认存储引擎)
MyISAM(5.5以前的默认存储引擎)
CSV
MEMORY
BLACKHOLE
FEDERATED(Oracle(dblink----->MySQL))

2.1 第三方工具:

(1)TokuDB

优势:
    压缩比高
    插入性能很高
    
应用范围:监控 

(2)MyRocks
(3)RocksDB

3、InnoDB与MyISAM的区别?(面试题)

16955089-2d604212b50e8443.png
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 ) 
7>索引 B+tree B*TREE

4、存储引擎查看及简单修改

4.1 查询存储引擎
4.1.1 查看所有支持的存储引擎:
show engines;
4.1.1 使用 SELECT 确认会话存储引擎:
select @@default_storage_engine;
4.1.1 show查询每个表的存储引擎:
SHOW CREATE TABLE city\G;
SHOW TABLE STATUS LIKE 'city'\G
show table status;
show create table city;
4.1.1 INFORMATION_SCHEMA 确认每个表的存储引擎:
select table_schema,table_name ,engine  from information_schema.tables  where table_schema not in ('sys','mysql','information_schema','performance_schema');
4.2 修改默认存储引擎(不代表生产操作)

1> 会话级别修改:

set default_storage_engine=myisam;

2> 全局级别(仅影响新会话):

set global default_storage_engine=myisam;

注意:以上修改为临时修改,重启之后,所有参数均失效。
如果想要永久生效:

写入配置文件
vim /etc/my.cnf
[mysqld]
default_storage_engine=myisam

然后重启mysql服务
注:存储引擎是表级别的,每个表创建时可以指定不同的存储引擎,但是我们建议统一为innodb.

4.3 修改一个表的存储引擎
alter table t engine=innodb;

扩展:批量修改表的存储引擎

-- 将world库下所有表的引擎替换为innoDB
select concat("alter table ",table_name," engine=innodb")  from information_schema.tables where  table_schema='world';

注意:此命令我们经常使用他,进行innodb表的碎片整理

4.4 平常处理过的MySQL问题--碎片处理
环境:centos7.4,MySQL 5.7.20,InnoDB存储引擎
业务特点:数据量级较大,经常需要按月删除历史数据.
问题:磁盘空间占用很大,不释放
处理方法:
    以前:将数据逻辑导出,手工drop表,然后导入进去
    现在:对表进行按月进行分表(partition,中间件)
业务替换为truncate方式
4.5 扩展:如何批量修改

需求:将zabbix库中的所有表,innodb替换为tokudb

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

5、InnoDB存储引擎物理存储结构

5.1 InnoDB最直观的存储方式
*.frm:表的列定义
*.ibd:表的数据和索引     *****
ibdata1(5.7版本):共享表空间文件(回滚数据--UNDO(8.0版本)、系统数据字典)   *****
ib_logfile0 ~ ib_logfileN:redo log文件    *****
ibtmp1(5.7版本):存放临时表
ib_buffer_pool:缓冲区池的映射文件
5.2 InnoDB的表空间管理模式介绍
5.2.1 共享表空间模式(5.5 默认)
ibdata1:目前遗留下来了,用来存储系统数据.
=============================================
5.5版本出现的管理模式,也是默认的管理模式。
5.6版本以,共享表空间保留,只用来存储:系统数据字典信息,undo,临时表。
5.7 版本,临时表被独立出来了
8.0版本,undo也被独立出去了
=============================================
5.2.1 独立表空间模式(5.6以后默认)

一个表一个ibd文件

5.3、共享表空间的设置

1>查看控制表空间的设置:

wenjuan[world]>select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend  |
+-------------------------+
1 row in set (0.01 sec)

wenjuan[world]>

------------------说明:-----------------
ibdata1:应用表空间的名字
12M:默认大小
autoextend:自动扩展,就是12M用完了,会在文件的基础上自动每次扩展64M

默认每次增长的大小:
wenjuan[world]>show variables like '%extend%';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64    |
+-----------------------------+-------+
1 row in set (0.00 sec)

wenjuan[world]>

不需要经常设置,一般在mysql初始化之前设定好就行:

mysql初始化之前,在vim /etc/my.cnf中加入innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend

5.4 独立表空间(5.6以后,默认就支持)设置
1> 查询独立表空间模式
wenjuan[world]>select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

wenjuan[world]>

------------------说明:---------
值只有两种情况:
1-----on----打开独立表空间模式
0-----off---关闭独立表空间模式,就是共享表空间模式
2> 修改表空间模式-------共享表空间体验(不代表生产操作):
wenjuan[(none)]>set global innodb_file_per_table=0;
5.5 独立表空间迁移
alter table t1 discard tablespace;    ----清掉ibd文件
alter table t1 import  tablespace;    ----重新导入ibd文件
DDL  DCL  DML 

innoDB表 :  ibdata1 + frm + ibd

6、InnoDB核心特性--事务(Transaction)

6.1 简介

事务:保证在一个完整的业务逻辑中,所有涉及到的语句,要么全成功,要么全失败.

6.2 ACID特性
Atomic(原子性):所有语句作为一个单元全部成功执行或全部取消。不能出现中间状态。
Consistent(一致性):如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性):事务之间不相互影响。
Durable(持久性):事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
6.3 事务的生命周期(事务控制语句)
6.3.1 开启事务
begin;
或
start transaction;
6.3.2 标准的事务语句(DML: insert update delete)
wenjuan[world]>delete from city where id>1000;
wenjuan[world]>delete from city where id<500;
6.3.3 事务的结束

(1)rollback; 回滚事务

oldguo[world]>begin;
oldguo[world]>delete from city where id>1000;
oldguo[world]>delete from city where id<500;
oldguo[world]>rollback;

(2)commit ; 提交事务

oldguo[world]>begin;
oldguo[world]>delete from city where id>1000;
oldguo[world]>delete from city where id<500;
oldguo[world]>commit;
6.3.4 自动提交功能
查询事务开启状态:select @@autocommit;(默认开启事务)

(1)关闭会话级别事务:----------临时关闭,重启mysql之后失效

set autocommit=0;

(2)全局关闭事务:-----------临时关闭,重启mysql之后失效

set global autocommit=0;

(3)永久生效:

在 /etc/my.cnf中加入autocommit=0,然后重启mysql
6.3.5 隐式提交的语句
用于隐式提交的 SQL 语句:
begin;
SET AUTOCOMMIT = 1
导致提交的非事务语句:
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE

7、InnoDB 事务的ACID如何保证?

7.1概念
redo log        : 重做日志, 记录数据页的变化. ib_logfile0-n
redo log buffer : redo log 的缓冲区(内存)
ibd             : 表空间的数据文件,以段区页方式规划存储数据行和索引
buffer pool     : 数据页缓冲区
LSN             : Log seq no 日志序列号,redo log\log buffer\ibd\buffer pool
WAL             : write ahead log 日志优先写磁盘
脏页            : dirty page 在内存中被修改的数据,并还没有写入磁盘
CKPT            : checkpoint,将内存脏页回写到磁盘的动作
TXID            : transaction_id,事务ID,伴随着事务的整个生命周期.
undo log        : 回滚日志,ibdata1

未完……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值