MySQL 笔记一(引擎的简要介绍)

InnoDB

InnoDB主要是支持回滚, 支持ACID事务, 支持行级锁(比页级或表级锁定占用更多的内存)以及具有奔溃修复能力 等特点。相比MyIASM, InnoDB的写入操作要高效以及稳定得多.

提供外键约束.

InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。

ACID事务

原子性(Atomicity)

与redis非关系型数据支持原子性的特点一样,在整个事务操作中,它仅仅有两种情况,要不全部完成,要不都不完成。当事务在操作过程中,遇到特殊情况,例如insert的时候遇到索引/主键冲突, 整个操作会失败退出。会被回滚到未操作之前的状态。

一致性(Consistency)

指的是无论事务并发有多少,其操作都会变成一个串行任务进行处理。遵循幂等性原则,保证数据的不变。

隔离性(Isolation)

隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

简单的例子就是,多线程写入数据库的数据库,当insert进行的时候,他会保证在同一时间仅有一个请求用于insert数据

持久性(Durability)

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。为了保证数据写入数据库后的持久性,有两种方式进行持久性化:

  1. Write ahead logging,也就是日志式的方式(现代数据库均基于这种方式)。将数据写入日志文件。用于冷备份, 或者主从传输进行读写分离。
  2. shadow paging分块技术实现起来比较简单,消除了写日志记录的开销恢复的速度也快(不需要redo和undo)。shadow paging的缺点就是事务提交时要输出多个块,这使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况——这是它致命的缺点

行级锁

行级锁是mysql中粒度最细的一种锁机制,表示只对当前所操作的行进行加锁,行级锁发生冲突的概率很低,其粒度最小,但是加锁的代价最大。行级锁分为共享锁和排他锁。
缺点: 开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最大,并发性也高;
因此行级锁主要应用在事务性引擎上

MyISAM

MyISAM没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。


MyISAM是没有死锁问题的,因为他会一次性获得所有的锁


每个MyISAM在磁盘上存储成三个文件,每一个文件的名字均以表的名字开始,扩展名指出文件类型。

1. .frm文件存储表定义;
2. ·MYD (MYData)文件存储表的数据;
3. .MYI (MYIndex)文件存储表的索引。

表级锁

两种模式: 表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock).因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。

存储格式

支持3种不同的存储格式,分别是:静态表;动态表;压缩表

静态表

表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。

动态表

记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能

压缩表

因为每个记录是被单独压缩的,所以只有非常小的访问开支

缺点

不能主动回复数据,需要执行命令。

Memory

原文: http://database.51cto.com/art/201711/556831.htm

Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围

索引

每张内存表可创建64个索引,每个索引最大支持16个列,一个key的长度最大值为3072bytes。

如果一个内存表hash索引的键值有很高的重复度,更新键值、删除操作速度都会显著降低。这种速度下降的程度与键值重复度成正比。您可以使用BTREE索引来规避这个问题。

内存表可以有非唯一键(这是hash索引不常用的功能)。

索引列中可包含NULL值。

注意要点

内存表的空间使用小块(small block)。表使用100%动态hash插入。已删除的行放到空闲列表中,下次插入新数据会被使用。
使用定长的行存储格式。变长类型存入内存表需转换为定长。
不支持BLOB、TEXT类型的列。
内存表支持自增列(AUTO_INCREMENT)
不能在多个会话上共享临时表。

服务器必须有足够内存,来满足多张内存表的使用。

如果从内存表中删除单独的行,并不会回收内存。当整个内存表删除时,才回收内存。同一张内存表,之前删除行占用的空间,会被新的行复用。

Merge

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。
如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效

使用要点

Merge使用表挂靠子表,子表需要有完全相同的结构,索引,主键,字段等要完全相同。当子表在使用Merge建表后,其重复主键会保留不发生冲突。但是你一旦在建表后往里导致主键,索引冲突,会发生错误。也即是Merge只对建表后的操作负责。

常见问题

原文:https://blog.csdn.net/qmhball/article/details/7499432

1)建表时UNION指明的子表如果存在相同主键的记录会怎么样?

相同主键的记录会同时存在于MERGE中,就像第三节中的例子所示。但如果继续向MERGE表中插入数据,若数据主键已存在则无法插入。换言之,MERGE表只对建表之后的操作负责。

2)若MREGE后存在重复主键,按主键查询会是什么结果?

顺序查询,只出现一条查询记录即停止。

3)直接删除一个子表会出现什么情况,正确删除的方式是怎样的?

MERGE表会被破坏,正确方式是用alter table方式先将子表从MERGE表中去除,再删除子表。

4)误删子表时,如何恢复MERGE表?

误删子表时,MERGE表上将无法进行任何操作。
方法1,drop MERGE表,重建。重建时注意在UNION部分去掉误删的子表。

方法2,建立MERGE表时,会在数据库目录下生成一个.MRG文件,比如设表名为t,则文件名为t.MRG。
文件内容类似:

t1
t2
#INSERT_METHOD=LAST

指明了MGEGE表的子表构成及插入方式。
可以直接修改此文件,去掉误删表的表名。然后执行flush tables即可修复MERGE表。

5)MERGE的子表中之前有记录,且有自增主键,则MERGE表创建后,向其插入记录时主键以什么规则自增?

以各表中的AUTO_INCREMENT最大值做为下一次插入记录的主键值。
比如t1的自增ID至6,t2至4,则创建MERGE表后,插入的下一条记录ID将会是7

6)两个结构完全相同的但已存在数据的表,是否一定可以合成一个MEREGE表?

从实验的结果看,不是这样的,有时创建出的表,无法进行任何操作。
所以,推荐的使用方法是先有一个MERGE表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如200w)时,创建另一张空表,将其挂入MERGE表,然后继续插入记录。

7)删除MERGE表是否会对子表产生影响?

不会

8)MREGE表的子表的ENGINE是否有要求?

有的,必须是MyISAM表

Archive

原文: http://dev.mysql.com/doc/refman/5.6/en/archive-storage-engine.html

这个存储引擎基本上用于数据归档;它的压缩比非常的高,存储空间大概是innodb的10-15分之一所以它用来存储历史数据非常的适合,由于它不支持索引同时也不能缓存索引和数据,所以它不适合作为并发访问表的存储引擎。Archivec存储引擎使用行锁来实现高并发插入操作,但是它不支持事务,其设计目标只是提供高速的插入和压缩功能。

每个archive表在磁盘上存在两个文件
.frm(存储表定义)
.arz(存储数据)

存储

往archive表插入的数据会经过压缩,archive使用zlib进行数据压缩,archive支持optimize table、 check table操作。

一个insert语句仅仅往压缩缓存中插入数据,插入的数据在压缩缓存中被锁定,当select操作时会触发压缩缓存中的数据进行刷新。insert delay除外。

对于一个bulk insert操作只有当它完全执行完才能看到记录,除非在同一时刻还有其它的inserts操作,在这种情况下可以看到部分记录,select从不刷新bulk insert除非在它加载时存在一般的Insert操作。

检索

对于检索请求返回的行不会压缩,且不会进行数据缓存;一个select查询会执行完整的表扫描;当一个select查询发生时它查找当前表所有有效的行,select执行一致性读操作,注意,过多的select查询语句会导致压缩插入性能变的恶化,除非使用bulk insert或delay insert,可以使用OPTIMIZE TABLE 或REPAIR TABLE来获取更好的压缩,可以使用SHOW TABLES STATUS查看ARCHIVE表的记录行。

分区

与hbase一样, 支持分区操作

Federated

将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。

注意要点

  1. 本地虚拟表与远程实体表之间是 TCP 长连接,并且是多个客户端利用的。所以不用担心因频繁建立连接带来的网络开销。
  2. 本虚拟表表与远程实体表之间的网络连接断开后,当对虚拟表发起查询时,它会尝试重新连接远程实体表,所以我们不用担心网络连接断开造成的永久中断问题。
  3. 如果无时间未对本地虚拟表作任何操作,虚拟表与实体表之间的连接将在远程主机的 wait_timeout 秒后自动断开,当对虚拟表发起查询时,连接又会重新建立。

Cluster/NDB

高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用

CSV

逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

BLACKHOLE

实质上不存储各种数据,只存对于sql的操作。其表现就像一个黑洞,只进不出,进来就消失。

用途

1.作为伪主库分担主库负担

众所周知,当从库比较多的时候,所有从库都从主库load数据将加重主库的负担。但如果是从BlackHole的伪主库中同步就可以减轻主库的负担。

2. 作为binlog日志收集器

其不保存实际数据,只记录binlog的特性,使得该引擎可用于binlog日志收集,便于数据库分析。
相关知识:binlog日志的format有三种:row,statement,mixed。
row的方式记录每一行被改变的记录,也就说,update将记录所有符合条件被修改的行,alter table更惨,相当于重建整个表,记录所有行的改变。所以这种格式下日志容易过大;
statement的方式只记录改变数据的SQL,没有row方式的问题,但其会记录该SQL执行的上下文信息,有个不好的地方是,该上下文信息在另一端重现的时候,容易因为较复杂的信息负责出错。
mixed的方式综合row和statement的方式。

主要区别 InnoDB MyISAM

engine支持事务外键优势奔溃修复锁类型递归
InnoDB支持自动回复行级锁不支持
MyISAM不支持不可自动回复表级锁不支持
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值