MySQL存储引擎
1. 存储引擎
#看你的mysql现在已提供什么存储引擎:
mysql> show engines;
#看你的mysql当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
1.1. MyISAM
MySql 5.5之前默认的存储引擎
MyISAM 存储引擎由MYD和MYI组成
create table testmysam (
id int PRIMARY key
) ENGINE=myisam
insert into testmysam VALUES(1),(2),(3)
1.1.1. 表压缩
myisampack -b -f /usr/local/mysql/data/mall/testmysam.MYI
压缩后再往表里面新增数据就新增不了
insert into testmysam VALUES(1),(2),(3)
压缩后,需要
myisamchk -r -f /usr/local/mysql/data/mall/testmysam.MYI
1.1.2. 适用场景:
l 非事务型应用(数据仓库,报表,日志数据)
l 只读类应用
l 空间类应用(空间函数,坐标)
由于现在innodb越来越强大,myisam已经停止维护
(绝大多数场景都不适合)
1.2. Innodb
l Innodb是一种事务性存储引擎
l 完全支持事务得ACID特性
l Redo Log 和 Undo Log
l Innodb支持行级锁(并发程度更高)
show VARIABLES like 'innodb_log_buffer_size'
1.3. CSV
l 以csv格式进行数据存储
l 所有列都不能为null的
l 不支持索引(不适合大表,不适合在线处理)
l 可以对数据文件直接编辑(保存文本文件内容)
create table mycsv(id int not null,c1 VARCHAR(10) not null,c2 char(10) not null) engine=csv;
insert into mycsv values(1,'aaa','bbb'),(2,'cccc','dddd');
vi /usr/local/mysql/data/mall/mycsv.CSV 修改文本数据
flush TABLES;
select * from mycsv
create index idx_id on mycsv(id)
1.4. Archive
l 组成
以zlib对表数据进行压缩,磁盘I/O更少
数据存储在ARZ为后缀的文件中
l 特点:
只支持insert和select操作
只允许在自增ID列上加索引
create table myarchive(id int auto_increment not null,c1 VARCHAR(10),c2 char(10), key(id)) engine = archive;
create index idx_c1 on myarchive(c1)
INSERT into myarchive(c1,c2) value('aa','bb'),('cc','dd');
delete from myarchive where id = 1
update myarchive set c1='aaa' where id = 1
1.5. Memory
1.5.1. 特点
l 文件系统存储特点
也称HEAP存储引擎,所以数据保存在内存中
l 支持HASH索引和BTree索引
l 所有字段都是固定长度 varchar(10) = char(10)
l 不支持Blog和Text等大字段
l Memory存储引擎使用表级锁
l 最大大小由max_heap_table_size参数决定
show VARIABLES like 'max_heap_table_size'
create table mymemory(id int,c1 varchar(10),c2 char(10),c3 text) engine = memory;
create table mymemory(id int,c1 varchar(10),c2 char(10)) engine = memory;
create index idx_c1 on mymemory(c1);
create index idx_c2 using btree on mymemory(c2);
show index from mymemory
show TABLE status LIKE ‘mymemory’
1.5.2. 与临时表的区别
1.5.3. 使用场景
l hash索引用于查找或者是映射表(邮编和地区的对应表)
l 用于保存数据分析中产生的中间表
l 用于缓存周期性聚合数据的结果表
6.6. Ferderated
l 提供了访问远程MySQL服务器上表的方法
l 本地不存储数据,数据全部放到远程服务器上
l 本地需要保存表结构和远程服务器的连接信息
使用场景
偶尔的统计分析及手工查询(某些游戏行业)
默认禁止,启用需要再启动时增加federated参数
show ENGINES
create database local;
create database remote;
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
INSERT into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('eee','fff');
CREATE TABLE `local_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://root:root1234%@127.0.0.1:3306/remote/remote_fed'
select * from local_fed
delete from local_fed where id = 2
select * from remote.remote_fed