Innodb引擎用表空间进行数据存储:
innodb_file_per_table
ON:独立表空间:tablename.ibd (mysql5.6后版本为默认配置) .frm文件是记录数据表结构的文件,.ibd文件是innodb实际存储数据的文件
OFF:系统表空间:ibddataX .frm ibddataX
注意:frm文件是mysql服务器层产生的,mysql服务器层保存的东西与存储引擎是无关的
innodb数据字典:是innodb内部产生的,可以保证事务的安全性,是本身封装了一些自定义
查询:
mysql> show variables like '%innodb_file_per%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)创建表,指定引擎:engine
mysql> create table myinnodb(id int,name varchar(10)) engine='innodb';
比较:
- 系统表空间无法简单的收缩文件文件大小
- 独立表空间可以通过optimize table 命令收缩系统文件
- 系统表空间会产生IO瓶颈
- 独立表空间可以同时向多个文件刷新数据 (对于频繁写入的业务特别适合)
数据转移: 系统表空间数据------------>独立表空间数据
步骤:
(1)mysqldump导出所有的数据库表数据,记得数据存储过程,触发器要一起导出
(2)停止mysql服务器,修改参数innodb_file_per_table=ON,并删除innodb相关文件
(3)重启mysql服务,重建innodb系统表空间
(4)重新导入数据
- innodb是事务性的存储引擎
- 完全支持事务的ACID特性(原子性,一致性,隔离性,持久性)
- 日志类型: Redo log(重做日志。实现事务的持久性) 和 Undo log (回滚日志)
- innodb支持行级锁,可以最大程度的支持并发 注意:行级锁是在存储引擎层实现的
mysql> show variables like 'innodb_log_buffer_size'; (redo log 默认配置缓存区的大小)
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 | 数字以字节为单位的,每隔一秒都会将缓存区刷新到磁盘上,并不需要配置太大
+------------------------+----------+
锁:
- 锁主要作用是管理共享资源的并发访问
- 锁用于实现事务的隔离性
锁的类型:
- 共享锁(读锁) 读锁直接是相互不会阻塞的
- 独占锁(写锁)
锁的粒度:
- 表级锁
- 行级锁 是在存储引擎中实现的
表级独占锁演示:
终端一:加一个表级独占锁:
mysql> lock table myinnodb write;
终端二:查看这个表: 结果是显示不出数据
终端一:解锁表
mysql> unlock tables;
终端二:刚刚查看的表: 结果显示出了数据
阻塞和死锁
- 什么是阻塞 因为不同锁之间兼容性关系,有些时刻一个事务中的锁需要等待另一个事务中的锁释放,所占用的资源 eg:上边的表级锁演示
- 阻塞是为了确保事务可以并发且正常的运行,如果出现大量阻塞,可能是有些表出现了慢查询等一些问题,大量阻塞会导致系统的整体资源性能下降
- 什么是死锁 指俩个或俩个以上的事务在执行过程中,相互占用了对方等待的资源而产生的异常
innodb状态检查:
mysql> pager more; 相当于less的作用,可以对下边输出信息翻页查看
mysql> show engine innodb statusG 所显示信息中可以看到读跟写的进程,默认为4读4写,可配置
Innodb适用场景:
- mysql5.7之前全文索引跟空间函数只能用myisam
- mysql5.7之后的版本,innodb也支持全文索引、空间函数,innodb适合于大多数的OLTP应用
mysql常用存储引擎 Myisam: mysql5.5之前默认存储引擎
文件系统存储特点:
- MYD为数据文件,MYI为索引文件,frm为数据结构文件
- 并发性和锁级别 表级锁,对于读写混合并发性并不好
- 表损坏修复 可能会造成数据丢失 命令行工具:
mysql> check table myarz; 检查表
+---------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+-------+----------+----------+
| thetest.myarz | check | status | OK |
+---------------+-------+----------+----------+
1 row in set (0.00 sec)mysql> repair table myarz; 修复表
+---------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+--------+----------+----------+
| thetest.myarz | repair | status | OK |
+---------------+--------+----------+----------+
1 row in set (0.01 sec)
特性:
- myisam表支持数据压缩 命令行:myisampack
限制:
- MYSQL5.0之前版本默认支持表大小为4G,如果要存储大表需要修改:MAX_Rows 和 AVG_ROW_LENGTH 这俩个参数数值相乘的大小为准
- mysql5.0版本以后默认支持单表大小为256TB
适用场景:
- 非事务型应用
- 只读类报表应用 只读之间共享锁不会堵塞
- 空间类应用
mysql常用存储引擎 CSV:
文件系统存储特点:
- 数据CSV文件以文本形式在文件中,可以直接less、more、vim去查看
- .csv文件存储表内容
- .csm文件存储标的元数据如表状态和数据量
- .frm文件存储表结构信息
特点:
- 以csv格式进行数据存储
- 所有列必须都不能是NULL的
- 不支持索引(对于表的查询效率特别低)
- 支持对数据文件直接编辑,保存文本文件内容
不支持表的列为NULL的演示:
mysql> create table mycsv(id int,name varchar(10)) engine=csv; 以下报错就说明了csv索引是不支持表的列为NULL
ERROR 1178 (42000): The storage engine for the table doesn't support nullable columns
mysql> create table mycsv(id int not null,name varchar(10) not null) engine=csv;
Query OK, 0 rows affected (0.02 sec)不支持索引的演示:
mysql> create index idx_id on mycsv(id);
ERROR 1069 (42000): Too many keys specified; max 0 keys allowed 0的关键键表示不支持索引
适用场景:
- 适合作为数据交换的中间件
mysql常用存储引擎 Archive:
文件系统存储特点:
- 以zlib对表数据进行压缩,磁盘I/O更少 比如10T的数据表,如果用Archive可能只需要几百M就够了
- 数据存储在以ARZ为后缀的文件中
功能特点:
- 只支持insert跟select操作
- 只允许在自增ID列上加索引
mysql> create table myarz(id int auto_increment not null,name varchar(10),key(id)) engine=Archive;
mysql> delete from myarz; 1031报错表示不支持这种操作
ERROR 1031 (HY000): Table storage engine for 'myarz' doesn't have this optionmysql> update myarz set name='bbb' where id=1;
ERROR 1031 (HY000): Table storage engine for 'myarz' doesn't have this optionmysql> create index idx_id on myarz(id);
ERROR 1069 (42000): Too many keys specified; max 1 keys allowed
使用场景:
- 日志和数据采集类应用 日志采集表,数据记录表 注意:只能收集跟记录,不能修改
mysql常用存储引擎 Memory:
文件系统存储特点:
- 也称HEAP存储引擎,所有的数据保存在内存中
- 数据保存在内存说明数据是易丢失的,一旦mysql服务器重启,所有memory表中的数据都会丢失,但是表结构会保留
功能特点:
- 支持HASH索引和BTree索引 (默认为HASH索引,等值查询HASH索引特别快,范围查询要用BTree索引)
- 所有字段都为固定长度varchar(10)=char(10)
- 不支持BLOG和TEXT等大字段
- 使用表级锁 表的最大大小是由max_heap_table_size参数决定
- 默认值为16M,修改以后对已经存在的memory引擎的表是无效的,只能对表重建进行生效
不支持text大表类型
mysql> create table mymem(id int,c1 varchar(10),c2 char(10),c3 text) engine=memory;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns建立索引
mysql> create index idx_c1 on mymem(c1);
mysql> create index idx_c2 using btree on mymem(c2);
mysql> show create table mymem;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mymem | CREATE TABLE `mymem` (
`id` int(11) DEFAULT NULL,
`c1` varchar(10) DEFAULT NULL,
`c2` char(10) DEFAULT NULL,
KEY `idx_c1` (`c1`),
KEY `idx_c2` (`c2`) USING BTREE
) ENGINE=MEMORY DEFAULT CHARSET=utf8 |查看索引
mysql> show index from mymemG
Column_name: c1
Index_type: HASH
Column_name: c2
Index_type: BTREE查看表的状态信息:
mysql> show table status like 'mymem'G
适用场景:
- 用于查找或者映射表,例如邮编和地区的对应表
- 用于保存数据分析中产生的中间表
- 用于缓存周期性聚合数据的结果表
- 注意:memory数据容易丢失,所以要求数据可以再生
mysql常用存储引擎 Federated: 当前版本mysql默认是禁止的
文件系统存储特点:
- 提供了访问远程mysql服务器上表的方法
- 本地不存储数据,数据都放在了远程服务器上
- 本地需要保存表结构和远程服务器连接的信息
如何使用
- 默认禁止,启动需要在启动时增加federated参数
- mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name
1.mysql> show enginesG
Engine: FEDERATED
Support: NO 默认是不支持的
Comment: Federated MySQL storage engine2.在my.cnf文件配置,然后重启mysql
#支持Federated引擎,1表示开启
federated=13.mysql> show enginesG
Engine: FEDERATED
Support: YES
演示:
创建俩个库: 一个远程,一个本地
mysql> create database local; 本地
mysql> create database remote; 远程
远程数据库创建表,插入数据,创建用户并授权
mysql> use remote;
mysql> create table remote_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10) not null default '',primary key(id))engine=innodb;
mysql> insert into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('eee','fff');
mysql> grant all privileges on remote.* to 'fred'@'%' identified by '111';
使用本地库,创建连接通道
mysql> create table local_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10) not null default '',primary key(id))engine=federated connection='mysql://fred:111@192.168.122.15:3306/remote/remote_fed';
mysql> select * from local.local_fed; 下面报错是因为:同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞;
ERROR 1429 (HY000): Unable to connect to foreign data source: Host '192.168.122.15' is blocked because of many connection erro解决方法:mysql> flush hosts;
mysql> select * from local.local_fed;
+----+-----+-----+
| id | c1 | c2 |
+----+-----+-----+
| 1 | aaa | bbb |
| 2 | ccc | ddd |
| 3 | eee | fff |
+----+-----+-----+
适用场景
- 偶尔的统计分析和手工查询
如何使用存储引擎
参考条件:
- 事务 ------如果要支持事务的话,innodb是首选
- 备份 ------可以在线热备的存储引擎,只有innodb拥有免费热备方案
注意:mysqldump不算是热备,他是一种逻辑备份,在备份的时候会对数据加锁 - 崩溃恢复 -------myisam数据比Innodb存储引擎数据更容易丢失
- 存储引擎的特有特性 -------建议不要混合使用存储引擎
啊