文章目录
一、存储引擎简介1、MySQL支持的存储引擎2、常用存储引擎对比
二、查看存储引擎1、查看存储引擎设置2、查看表存储引擎状态1、查看指定表2、查看全局表
三、修改存储引擎1、修改存储引擎2、整理碎片(仅限innodb)3、批量替换
四、InnoDB存储引擎物理存储结构1、共享表空间1、查看共享表空间参数设置2、共享表空间自定义设置(MySQL初始化)
2、独立表空间1、独立表空间设置2、独立表空间迁移
五、事务(InnoDB引擎)1、事务的ACID特性2、事务的生命周期1、开启事务2、标准事务语句3、事务结束
3、自动提交机制(autocommit)1、查看参数2、修改参数(关闭自动提交)4、隐式提交
4、事务的ACID1、redo 重做日志2、undo 回滚日志3、锁4、隔离级别1、查看数据库隔离级别2、更改隔离级别方法
5、InnoDB核心参数
一、存储引擎简介
1、MySQL支持的存储引擎
mysql
> show engines
;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine
| Support
| Comment
| Transactions
| XA
| Savepoints
|
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV
| YES
| CSV storage engine
| NO
| NO
| NO
|
| MRG_MYISAM
| YES
| Collection of identical MyISAM tables
| NO
| NO
| NO
|
| MyISAM
| YES
| MyISAM storage engine
| NO
| NO
| NO
|
| BLACKHOLE
| YES
| /dev/null storage engine
(anything you
write to it disappears
) | NO
| NO
| NO
|
| PERFORMANCE_SCHEMA
| YES
| Performance Schema
| NO
| NO
| NO
|
| MEMORY
| YES
| Hash based, stored
in memory, useful
for temporary tables
| NO
| NO
| NO
|
| ARCHIVE
| YES
| Archive storage engine
| NO
| NO
| NO
|
| InnoDB
| DEFAULT
| Supports transactions, row-level locking, and foreign keys
| YES
| YES
| YES
|
| FEDERATED
| NO
| Federated MySQL storage engine
| NULL
| NULL
| NULL
|
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows
in set (0.00 sec
)
2、常用存储引擎对比
存储引擎优点缺点
innoDB提供事务的支持,回滚,崩溃修复恢复能力,多版本事务并发控制(默认存储引擎)读写效率较差,占用的数据库空间较大Memory内存中对数据创建表,数据全部存储在内存,读写速度非常快,对数据的安全性要求比较低生命周期短MYISAM支持三种存储方式:静态型,动态型,压缩型,占用的空间小,存储的速度快不支持事务和并发TokuDB注重insert性能,压缩比高,数据的插入性能高限制记录不能太大,不注重update的性能
二、查看存储引擎
1、查看存储引擎设置
mysql
> SELECT @@default_storage_engine
;
+--------------------------+
| @@default_storage_engine
|
+--------------------------+
| InnoDB
|
+--------------------------+
1 row
in set (0.00 sec
)
2、查看表存储引擎状态
1、查看指定表
mysql
> show create table school.test
;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table
| Create Table
|
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE
`test` (
`id` int
(11
) NOT NULL AUTO_INCREMENT COMMENT
'学号',
`sname` varchar
(255
) NOT NULL COMMENT
'姓名',
`age` tinyint
(3
) unsigned NOT NULL DEFAULT
'0' COMMENT
'年龄',
`gender` enum
('m',
'f',
'n') NOT NULL DEFAULT
'n' COMMENT
'性别',
`intime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT
'入学时间',
PRIMARY KEY
(`id`)
) ENGINE
=InnoDB DEFAULT CHARSET
=utf8mb4
|
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
in set (0.01 sec
)
2、查看全局表
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
| stu
| InnoDB
|
| school
| test | InnoDB
|
| test | t100w
| InnoDB
|
| world
| city
| InnoDB
|
| world
| country
| InnoDB
|
| world
| countrylanguage
| InnoDB
|
+--------------+-----------------+--------+
6 rows
in set (0.03 sec
)
三、修改存储引擎
1、修改存储引擎
mysql
> alter table school.test engine
=MyISAM
;
Query OK, 0 rows affected
(0.02 sec
)
Records: 0 Duplicates: 0 Warnings: 0
mysql
> show create table school.test
;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table
| Create Table
|
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE
`test` (
`id` int
(11
) NOT NULL AUTO_INCREMENT COMMENT
'学号',
`sname` varchar
(255
) NOT NULL COMMENT
'姓名',
`age` tinyint
(3
) unsigned NOT NULL DEFAULT
'0' COMMENT
'年龄',
`gender` enum
('m',
'f',
'n') NOT NULL DEFAULT
'n' COMMENT
'性别',
`intime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT
'入学时间',
PRIMARY KEY
(`id`)
) ENGINE
=MyISAM DEFAULT CHARSET
=utf8mb4
|
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
in set (0.00 sec
)
2、整理碎片(仅限innodb)
mysql
> alter table school.test engine
=innodb
;
Query OK, 0 rows affected
(0.02 sec
)
Records: 0 Duplicates: 0 Warnings: 0
3、批量替换
批量替换zabbix表存储引擎innodb为tokudb
mysql
> select concat
("alter table ",table_schema,
".",table_name,
" engine=tokudb;")
from information_schema.tables
where table_schema
='zabbix';
四、InnoDB存储引擎物理存储结构
[root@mysql-1 ~
]
[root@mysql-1 data
]
总用量 122928
-rw-r----- 1 mysql mysql 56 8月 27 19:00 auto.cnf
drwxr-x--- 2 mysql mysql 20 8月 28 22:16 blog
-rw-r----- 1 mysql mysql 307 8月 29 23:39 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 10月 5 13:54 ibdata1
-rw-r----- 1 mysql mysql 50331648 10月 5 13:54 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 10月 4 16:33 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 10月 4 18:01 ibtmp1
drwxr-x--- 2 mysql mysql 4096 8月 27 19:00 mysql
-rw-r----- 1 mysql mysql 7637 8月 29 23:39 mysql-1.err
-rw-r----- 1 mysql mysql 6 8月 30 00:05 mysql-1.pid
drwxr-x--- 2 mysql mysql 8192 8月 27 19:00 performance_schema
drwxr-x--- 2 mysql mysql 82 10月 5 13:54 school
drwxr-x--- 2 mysql mysql 8192 8月 27 19:00 sys
drwxr-x--- 2 mysql mysql 56 10月 4 17:43
test
drwxr-x--- 2 mysql mysql 144 9月 7 09:53 world
组件说明
ibdata1系统数据字典信息(统计信息),UNDO表空间等数据ib_logfile0 ~ ib_logfile1REDO日志文件,事务日志文件ibtmp1临时表空间磁盘位置,存储临时表frm存储表的列信息ibd表的数据行和索引ib_logfile0 ib_logfile1Redo Log,重做日志ibdata1存储在共享表空间中,回滚日志ibtmp1临时表,在做join union操作产生临时数据,用完自动清理
1、共享表空间
1、查看共享表空间参数设置
初始生成默认大小为12M的共享表空间,当空间不足时自动扩展,每次增加64M
mysql
> select @@innodb_data_file_path
;
+-------------------------+
| @@innodb_data_file_path
|
+-------------------------+
| ibdata1:12M:autoextend
|
+-------------------------+
1 row
in set (0.01 sec
)
mysql
> show variables like
'%extend%';
+-----------------------------+-------+
| Variable_name
| Value
|
+-----------------------------+-------+
| innodb_autoextend_increment
| 64
|
+-----------------------------+-------+
1 row
in set (0.01 sec
)
2、共享表空间自定义设置(MySQL初始化)
初始生成默认大小为512M的共享表空间,当空间不足时自动扩展,每次增加64M,作用是预留足够共享表空间。
[root@mysql-1 ~
]
2、独立表空间
作用: 存储用户数据 特点: 一个表一个ibd文件,存储数据行和索引信息 总结: 一张InnoDB表= frm+idb+ibdata1
1、独立表空间设置
mysql
> select @@innodb_file_per_table
;
+-------------------------+
| @@innodb_file_per_table
|
+-------------------------+
| 1
|
+-------------------------+
mysql
> set global innodb_file_per_table
=0
; //1为开启,0为关闭,默认开启
2、独立表空间迁移
(1)创建和原表结构一致的空表 (2)将空表的ibd文件删除
mysql
> alter table 表名 dicard tablespace
;
(3)将原表的ibd拷贝过来,并且修改权限 (4)将原表ibd进行导入
mysql
> alter table 表名
import tablespace
;
五、事务(InnoDB引擎)
1、事务的ACID特性
特性说明
Atomic(原子性)所有语句作为一个单元全部成功执行或全部取消。不能出现中间状态。Consistent(一致性)如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。Isolated(隔离性)事务之间不相互影响。Durable(持久性)事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
2、事务的生命周期
1、开启事务
mysql
> begin
;
2、标准事务语句
DML语句 insert update delete
3、事务结束
1、回滚
mysql
> rollback
;
2、提交(提交后无法回滚)
mysql
> commit
;
3、自动提交机制(autocommit)
1、查看参数
mysql
> select @@autocommit
;
+--------------+
| @@autocommit
|
+--------------+
| 1
|
+--------------+
1 row
in set (0.00 sec
)
2、修改参数(关闭自动提交)
1、会话级别
mysql
> set autocommit
=0
;
2、全局级别
mysql
> set global autocommit
=0
;
3、永久修改(重启生效)
[root@mysql-1 ~
]
autocommit
=0
4、隐式提交
导致提交的非事务语句: DDL语句: (ALTER、CREATE 和 DROP) DCL语句: (GRANT、REVOKE 和 SET PASSWORD) 锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
4、事务的ACID
名词解释
redo log重做日志,ib_logfile0~1,默认50M , 轮询使用redo log bufferredo内存区域,包含数据页的变化信息+数据页当时的LSN号ibd存储 数据行和索引data buffer pool缓冲区池,数据和索引的缓冲LSN日志序列号,存在于ibd,redolog,data buffer pool,redo buffer中脏页内存脏页,内存中发生了修改,没写入到磁盘之前,我们把内存页称之为脏页CKPTCheckpoint,检查点,就是将脏页刷写到磁盘的动作TXID事务号,InnoDB会为每一个事务生成一个事务号,伴随着整个事务WALwrite ahead log 日志优先写的方式实现持久化,日志是优先于数据写入磁盘的
1、redo 重做日志
功能: (1)记录了内存数据页的变化. (2)提供快速的持久化功能(WAL) (3)CSR过程中实现前滚的操作(磁盘数据页和redo日志LSN一致)
2、undo 回滚日志
作用: (1)记录了数据修改之前的状态 (2)rollback 将内存的数据修改恢复到修改之前 (3)在CSR中实现未提交数据的回滚操作 (4)实现一致性快照,配合隔离级别保证MVCC,读和写的操作不会互相阻塞
3、锁
实现了事务之间的隔离功能,InnoDB中实现的是行级锁
4、隔离级别
级别说明
RU读未提交,可脏读,一般部议叙出现RC读已提交,会出现不可重复读,可能出现幻读,可以防止脏读RR可重复读,功能是防止"幻读"现象,利用的是undo的快照技术+GAP(间隙锁)+NextLock(下键锁),必须索引支持,通过MVCC基础解决了不可重复读(默认)SR可串行化,可以防止死锁,但是并发事务性能较差
注意: 在RC级别下可以减轻GAP+NextLock锁的问题,但是会出现幻读现象,一般在为了读一致性会在正常select后添加for update语句,但是执行完一定要commit,否则容易出现所等待比较严重.。
1、查看数据库隔离级别
[root@mysql-1 ~
]
mysql
> select @@tx_isolation
;
+-----------------+
| @@tx_isolation
|
+-----------------+
| REPEATABLE-READ
|
+-----------------+
1 row
in set, 1 warning
(0.00 sec
)
2、更改隔离级别方法
[root@mysql-1 ~
]
[mysqld
]
user
=mysql
basedir
=/usr/local/mysql
datadir
=/data/mysql/data
socket
=/tmp/mysql.sock
server_id
=6
port
=3306
[mysql
]
socket
=/tmp/mysql.sock
[root@mysql-1 ~
]
5、InnoDB核心参数
1、存储引擎默认设置
default_storage_engine
=innodb
2、表空间模式
innodb_file_per_table
=1
3、共享表空间文件个数和大小
innodb_data_file_path
=ibdata1:512M:ibdata2:512M:autoextend
4、“双一” 标准
innodb_flush_log_at_trx_commit
=1
-------
The default setting of 1 is required
for full ACID compliance. Logs are written and flushed to disk at each transaction commit.
With a setting of 0, logs are written and flushed to disk once per second. Transactions
for which logs have not been flushed can be lost
in a crash.
With a setting of 2, logs are written after each transaction commit and flushed to disk once per second. Transactions
for which logs have not been flushed can be lost
in a crash.
-------
翻译:为了完全符合ACID,默认设置为1是必需的。在每个事务提交时,日志被写入并刷新到磁盘。 如果设置为0,那么日志将每秒写入一次并刷新到磁盘。未为其刷新日志的事务可能会在崩溃中丢失。 如果设置为2,则在每个事务提交后写入日志,并每秒刷新到磁盘一次。未为其刷新日志的事务可能会在崩溃中丢失。 控制 Redo buffer 和 buffer pool
Innodb_flush_method
=(O_DIRECT,fsync
)
参数说明
fsync最高性能O_DIRECT注重安全
最高安全模式
innodb_flush_log_at_trx_commit
=1
Innodb_flush_method
=O_DIRECT
最高性能
innodb_flush_log_at_trx_commit
=0
Innodb_flush_method
=fsync
5、redo日志设置相关
innodb_log_buffer_size
=16777216 //日志缓冲区大小
innodb_log_file_size
=50331648 //日志大小(默认50M)
innodb_log_files_in_group
= 3 //redo个数(默认2个),即ib_logfile
6、脏页刷写策略
innodb_max_dirty_pages_pct
=75 //脏页占用内存比达到75%时写入磁盘