MySQL的存储引擎

2019-03-28  本文已影响0人  Sarahhhh

MySQL的存储引擎

1.查看所有引擎

mysql> show engines\G;  # 查看mysql的存储引擎

将结果列成表格

Engine Support Comment Transactions XA Savepoints
ARCHIVE YES Archive storage engine NO NO NO
BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO
MRG_MYISAM YES Collection of identical MyISAM tables NO NO NO
FEDERATED NO Federated MySQL storage engine NULL NULL NULL
MyISAM YES MyISAM storage engine NO NO NO
PERFORMANCE_SCHEMA YES Performance Schema NO NO NO
InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES
MEMORY YES Hash based, stored in memory, useful for temporary tables NO NO NO
CSV YES CSV storage engine NO NO NO

InnoDB和MyISAM对比

Feature MylSAM InnoDB
Clustered indexes No Yes
B-tree indexes Yes Yes
Hash indexes No No
T-tree indexes No No
Full-text search indexes Yes Yes
Data caches No Yes
Foreign key support No Yes
Locking granularity Table Row
Transactions No Yes
Storage limits 256TB 64TB
Compressed data* Yes Yes

*(MylSAM的压缩表必须使用压缩行格式,这种表在MylSAM里是只读的)

2.InnoDB

事务型

InnoDB的结构

InnoDB的主要优势

使用InnoDB的好处

可以在一个查询中join混用InnoDB引擎的表和其他引擎的表

3.MyISAM

MyISAM
适用场景:read-only or read-mostly workloads in Web and data warehousing configurations(查询效率很高,适合大量读操作的场景)

4.其他存储引擎

ARCHIVE

档案/归档

适用场景:作为仓库,存储大量的独立的作为历史记录的数据(插入速度快但查询支持较差)

存储

使用zlib 无损数据压缩。数据insert后即被压缩,放在一个压缩缓冲区中,select操作会导致清空缓冲区,此时数据被真正存储。支持批处理insert。

读取

行会根据需要解压,不设缓冲。select会导致全表扫描。select是读一致性的。大量查询during insertion会影响压缩。使用REPAIR TABLE或OPTIMIZE TABLE能获取更好的压缩。

BLACKHOLE

黑洞

适用场景:

1.转发器(会保存SQL语句的日志,并且复制给slave servers)

2.过滤器(设置使用黑洞引擎的“dummy” slave进程,依据一定规则将master的日志进行过滤并在BLACKHOLE表写一个新的日志,再复制给slaves,这样只会导致很少的开销)

Blackhole Engine and Auto Increment Columns

会导致错误,因为不论log文件是row-based还是statement-based,blackhole表不会存储自增列的数据,所以在slaves上insert时会出现重复的主码错误

Column Filtering

使用row-based replication时,如果slaves的表的字段比master少,那么过滤机制其实是在slaves上。如果缺失字段是私密的,不能给slaves获取的;或是有很多slaves,需要在发送数据前就把数据过滤掉以减少网络负载,就不适合这种方式。BLACKHOLE表就能实现在master上进行过滤。

MRG_MYISAM(MERGE)

组合merge多个MyIsam表

适用场景:Good for VLDB environments such as data warehousing

一个安全性问题:

The use of MERGE tables entails the following security issue: If a user has access to MyISAM table t, that user can create a MERGE table m that accesses t. However, if the user's privileges on t are subsequently revoked, the user can continue to access t by doing so through m.

FEDERATED

联盟

适用场景:Very good for distributed or data mart environments

PERFORMANCE_SCHEMA

性能

mysql>show databases;   # 就可以看到这个数据库啦
mysql> SHOW TABLES FROM performance_schema; # 查看所有表

MEMORY

内存

适用场景:存储临时、不重要的数据,例如作为缓存,适合大量读的情形 (limited updates)

Characteristics of MEMORY Tables

被删除的row会放进一个链表(不会回收内存),等插入新数据时拿出来复用,只有整个表被删除后才会回收内存。采用定长的行存储,即使是varchar也是定长存储的。

默认使用哈希索引,并且允许非唯一的哈希索引(但如果字段含大量重复值,性能会很低,这种情况最好用B树索引),被索引字段可以有NULL。

Managing Memory Use

# 释放内存
DELETE * FROM table_name;                               # 释放所有row占用的内存
TRUNCATE TABLE table_name;                          # 释放所有row占用的内存
DROP TABLE table_name;                                  # 释放整个table占用的内存
ALTER TABLE table_name ENGINE=MEMORY;       # 释放deleted row链表占用的内存
SET max_heap_table_size = 1024*1024*2;# 设定单个内存表的空间限制,单位是Byte,这里是2MB,默认16MB

CSV

数据存在csv文件中

5.设置存储引擎的方式

1.建表时设置

CREATE TABLE t3 (i INT) ENGINE = MEMORY;

2.建表后设置

ALTER TABLE t ENGINE = InnoDB;

3.设置默认存储引擎

SET default_storage_engine=NDBCLUSTER;
上一篇 下一篇

猜你喜欢

热点阅读