功能了解
数据读写
数据安全和一致性
提高性能
热备份
自动故障恢复
高可用方面支持
等.
存储引擎种类
InnoDB
MyISAM
MEMORY
ARCHIVE
FEDERATED
EXAMPLE
BLACKHOLE
MERGE
NDBCLUSTER
CSV
mysql>show engines;
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(GlobalTransactionID),多线程(Multi-Threads-SQL)
存储引擎查看
使用 SELECT 确认会话存储引擎
SELECT @@default_storage_engine;
写入配置文件vim/etc/my.cnf [mysqld]default_storage_engine=myisam
SHOW 确认每个表的存储引擎:
SHOW CREATE TABLE City\G;
SHOW TABLE STATUS LIKE 'CountryLanguage'\G
INFORMATION_SCHEMA 确认每个表的存储引擎
selecttable_schema,table_name,enginefrominformation_schema.tableswheretable_schema notin('sys','mysql','information_schema','performance_schema');
修改一个表的存储引擎
db01 [oldboy]>alter table t1 engine innodb;注意:此命令我们经常使用他,进行innodb表的碎片整理
平常处理过的MySQL问题--碎片处理(面试问题)
db01 [oldboy]>alter table t1 engine innodb;注意:此命令我们经常使用他,进行innodb表的碎片整理
5.6 平常处理过的MySQL问题--碎片处理
环境:centos7.4,MySQL 5.7.20,InnoDB存储引擎业务特点:数据量级较大,经常需要按月删除历史数据.
问题:磁盘空间占用很大,不释放处理方法:以前:将数据逻辑导出,手工drop表
,然后导入进去现在:对表进行按月进行分表(partition,中间件)业务替换为truncate方式
定期进行碎片整理
最直观的存储方式(/data/mysql/data)
ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据
ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件。
ibtmp1: 临时表空间磁盘位置,存储临时表
frm:存储表的列信息
ibd:表的数据行和索引
表空间(Tablespace)
6.1.1、共享表空间
需要将所有数据存储到同一个表空间中 ,
管理比较混乱5.5版本出现的管理模式,
也是默认的管理模式。5.6版本以,共享表空间保留,只用来存储:数据字典信息,undo,临时表。
5.7 版本,临时表被独立出来了
8.0版本,undo也被独立出去了
共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)
mysql>select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend |
+-------------------------+
1 row in set (0.00 sec)
mysql>show variables like '%extend%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64 |
+-----------------------------+-------+
1 row in set (0.01 sec)
搭建数据库环境的时候 可以提前设置好共享表空间
独立表空间:
从5.6,默认表空间不再使用共享表空间,替换为独立表空间。
主要存储的是用户数据存储特点为:一个表一个ibd文件,
存储数据行和索引信息基本表结构元数据存储:xxx.frm最终结论: 元数据 数据行+索引mysql表数据=(ibdataX+frm)+ibd(段、区、页)
DDL DML+DQLMySQL的存储引擎日志:Redo Log:ib_logfile0 ib_logfile1
,重做日志Undo Log:ibdata1ibdata2(存储在共享表空间中),
回滚日志临时表:ibtmp1,在做joinunion操作产生临时数据,用完就自动
mysql>select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
alter table city dicard tablespace; alter table cityimporttablespace; 比较重要
关闭表空间语句 (慎用)
set global innodb_file_per_table=0;
事务的ACID特性
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。不能出现中间状态。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
事务的生命周期(事务控制语句)
事务的开始
begin
标准的事物语句
DML:insert delete update
DDL 就是一个事物
自动提交策略(autocommit)
db01[(none)]>select @@autocommit;
db01[(none)]>setautocommit=0;
db01[(none)]>setglobalautocommit=0;
注:自动提交是否打开,一般在有事务需求的MySQL中,将其关闭不管有没有事务需求,
我们一般也都建议设置为0,可以很大程度上提高数据库性能
(1)setautocommit=0;setglobalautocommit=0;
+(2)vim/etc/my.cnfautocommit=0
隐式提交语句
用于隐式提交的SQL语句:begin
a b
begin
SETAUTOCOMMIT=1
导致提交的非事务语句:DDL语句: (ALTER、CREATE和DROP)
DCL语句: (GRANT、REVOKE和SETPASSWORD)
锁定语句:(LOCKTABLES和UNLOCKTABLES)
导致隐式提交的语句示例:TRUNCATETABLE
LOAD DATA INFILE
SELECT FOR UPDATE
InnoDB 事务的ACID如何保证?
redo的buffer:数据页的变化信息+数据页当时的LSN号LSN:日志序列号 磁盘数据页、内存数据页、redobuffer、redolog
脏页 内存里的数据 没有写到磁盘里的数据
checkpoint 将脏页的数据刷到磁盘