MySQL常用存储引擎

MySQL常用存储引擎之MyISAM

MySQL5.5之前版本默认存储引擎

临时表

在排序、分组等操作中,当数量超过一定的大小之后,由查询优化器建立的临时表。

MyISAM存储引擎表由MYD和MYI组成

CREATE TABLE `myIsam`(
    `id` int(11) DEFAULT NULL,
    `c1` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

ls -l
myIsam.frm
myIsam.MYD
myIsam.MYI
特性
  • 并发性与锁级别(表级锁)
  • 表损坏修复
    • check table tablename
    • repair table tablename
  • MyISAM表支持的索引类型
  • MyISAM表支持数据压缩
    命令行:myisampack
限制
  • 版本 如存储大表则修改MAX_Rows和AVG_ROW_LENGTH
  • 版本>MySQL5.0时默认支持为256TB
适用场景:
  • 非事务型应用
  • 只读类应用
  • 空间类应用

MySQL常用存储引擎之Innodb

MySQL5.5及之后版本默认存储引擎
Innodb使用表空间进行 数据存储
innodb_file_per_table
ON:独立表空间:tablename.ibd
OFF:系统表空间:ibdataX

show variables like 'innodb_file_per_table';

set global innodb_file_per_table=off;

系统表空间和独立表空间要如何选择

比较:
  • 系统表空间无法简单的收缩文件大小
  • 独立表空间可以通过optimize table命令收缩系统文件
  • 系统表空间会产生IO瓶颈
  • 独立表空间可以同时向多个文件刷新数据
建议:
  • 对Innodb使用独立表空间(MySQL5.6之后默认采用对表空间)

表转移的步骤

把原来存在于系统表空间中的表转移到独立表空间中的方法

步骤:
1、使用mysqldump导出所有数据库表数据
2、停止MySQL服务,修改参数,并删除Innodb相关文件
3、重启MySQL服务,重建Innodb系统表空间
4、重新导入数据

Innodb存储引擎的特性(1)

系统表空间和独立表空间要如何选择

  • Innodb 数据字典信息
  • Undo 回滚段
Innodb存储引擎的特性
  • Innodb是一种事务性存储引擎
  • 完全支持事务的ACID特性
  • Redo Log 和 Undo Log
show variables like 'innodb_log_buffer_size';
show variables like 'innodb_log_files_in_group';
  • Innodb支持行级锁
  • 行级锁可以最大程度的支持并发
  • 行级锁是由存储引擎层实现的
什么是锁
  • 锁对主要作用是管理共享资源的并发访问
  • 锁用于实现事务的隔离性
锁的类型
  • 共享锁(也称读锁)
  • 独占锁(也称写锁)
写锁 读锁
写锁 不兼容 不兼容
读锁 不兼容 兼容
锁的粒度
  • 表级锁
lock table tablename write;
unlock tables;
  • 行级锁
阻塞和死锁
  • 什么是阻塞
    不同锁的兼容性的关系,在有些时刻,一个事务中的锁需要等到另一个事务中的锁释放他所占用的资源,这就形成了阻塞。
  • 什么是死锁
    死锁是指两个或两个以上的事务在执行过程中,相互占用着对方等待的资源而产生的异常。
Innodb状态检查
show engine innodb status;
适用场景
  • Innodb适合于大多数OLTP应用

MySQL常用存储引擎之CSV

文件系统存储特点

数据以文本方式存储在文件中
.CSV文件存储表内容
.CSM文件存储表的元数据如表状态和数据量
.frm文件存储表结构信息

特点
  • 以CSV格式进行数据存储
  • 所有列必须都是不能为NULL的
  • 不支持索引
    不适合大表,不适合在线处理
  • 可以对数据文件直接编辑
    保存文本文件内容
适用场景

适合作为数据交换的中间表
电子表格->CSV文件->MySQL数据目录
数据->CSV文件->其他Web程序

MySQL常用存储引擎之Archive

文件系统存储特点
  • 以zlib对表数据进行压缩,磁盘I/O更少
  • 数据存储在ARZ为后缀的文件中
Archive存储引擎的特点
  • 只支持insert 和select 操作
  • 只允许在自增ID列上加索引
使用场景

日志和数据采集器应用

MySQL常用存储引擎之Memory

文件系统存储特点

也称HEAP存储引擎,所以数据保存在内存中

功能特点
  • 支持HASH索引和BTree索引
  • 所有字段都为固定长度 varchar(10)=char(10)
  • 不支持BLOG和TEXT等大字段
  • Memory存储引擎使用表级锁
  • 最大大小由max_heap_table_size参数决定
容易混淆的概念

Memory存储引擎
VS
临时表

  • 系统使用临时表
    • 超过限制使用Myisam临时表
      -未超限制使用Memory表
  • create temporary table 建立的临时表
使用场景
  • 用于查找或者是映射表,例如邮编和地区的对应表
  • 用于保存数据分析中产生的中间表
  • 用于缓存周期性聚合数据的结果表
    Memory数据易丢失,所以要求数据可再生

MySQL常用存储引擎之Federated

特点
  • 提供了访问远程MySQL服务器上表的方法
  • 本地不存储数据,数据全部放到远程服务器上
  • 本地需要保存表结构和远程服务器的连接信息
如何使用

默认禁止,启用需要在启动时增加federated参数
mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

show engines;
federated=1

create database local;
create database remote;
use remote;
create table remote_fed(id int auto_increment not null, c1 varchar(10) not null default '', c2 char(10) not null default '',primery key(id))engine=innodb;

show create table remote_fed\G
insert into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('ddd','fff');
grant select,update,insert,delete on remote.remote_fed to fred_link@'127.0.0.1' identified by '123456';

use local;
create table remote_fed(id int(11) not null auto_increment, c1 varchar(10) not null default '', c2 char(10) not null default '', primary key(id))engine=federated connection='mysql://fred_link:[email protected]:3306/remote/remote_fed';

rename table remote_fed to local_fed;
select * from local.local_fed;
delete from local.local_fed where id=2;
use remote;
select * fro remote_fed;
使用场景

偶尔的统计分析及手工查询

如何选择存储引擎

参考条件
  • 事务
  • 备份
  • 崩溃恢复
  • 存储引擎的特有特性

不要混合使用存储引擎

你可能感兴趣的:(MySQL常用存储引擎)