《深入浅出Mysql》阅读梳理 二

存储引擎介绍

在这里插入图片描述

MyISAM

M有LSAM是mysql5.5之前的默认存储引擎。他既不支持事务,也不支持外键。每个MyISAM在磁盘上存储成三个文件 .frm .MYD .MYI (存储表定义,存储数据,存储索引)
数据文件和索引文件可以放在不用的目录。MyISAM的表支持3种不同的存储格式。分别为,
静态标:静态表是默认的存储格式,其中的字段都是定长的。这样管理起来会更方便,因此存储速度也会更快,更容易缓存。但可能浪费更多的空间。同时当表遇到损坏时恢复起来也更容易。
动态表:其中的字段是变长的。更节约存储空间,但是存储速度偏慢。遇到损坏时恢复起来也更加不容易。
压缩表:压缩表的数据都是经过独立的压缩的,因此只占用很小的存储空间,访问开支非常小。

InnoDB

InnoDB是mysql5.5之后的默认存储引擎。他提供了具有提交、回滚、崩溃恢复能力的事务安全保障,同时提供了更小的锁粒度和更强的并发能力,拥有自己独立的缓存和日志。相较于MyISAM,InnoDB会占用更多的磁盘空间。但是在大多数情况下InnoDB仍然是更好的选择。
InnoDB存储引擎拥有许多不同于其他存储引擎的特点。

自动增长列

InooDB的自动增长列可以手动插入,如果插入为null的话,将自动递增。可以通过Alter table 表名 AUTO_INCREMENT = x。从x开始递增。默认从1开始。在mysql8.0之前自增列的计数器存储在内存中,如果数据库重启的话,下一个递增至将会是数据库中最大递增值+1。这个bug在mysql8.0之后已经被修复。解决的办法就是把自增列的计数器持久化到REDO log中。
LAST_INSERT_ID()函数将会获得上一次插入数据的自增列的值。如果上一次插入了多条数据,那么将获得,这些数据中的第一条的自增列的值。在InnoDB中自增列必须被索引,如果是组合索引的话必须是组合索引的第一列。MyISAM的自增列可以不是组合索引的第一列。此时自增列的值将会根据组合索引位于自增列前面的索引的排序结果得出。

外键约束

在常用的存储引擎中只有InnoDB有外键约束。创建外键时,主表的对应字段需要为唯一的。创建外键的语句为
constraint 外键名 foreign key(子表 外键) references (主表被引用的字段) on update [模式] on delete [模式]
模式有RESTRICT CASCADE SET NULL NO ACTION
其中NO ACTION和RESTRICT相同,都是表明不能删除/更新主表的被引用的字段
SET NULL :更新/删除主表后,子表的外键设置为NULL
CASCADE:更新/删除主表后,子表也更新/删除
可以通过命令来关闭外键检查
set FOREIGN_KEY_CHECKS = 0
可以通过命令开启外键检查
set FOREIGN_KEY_CHECKS = 1

主键和索引

InnoDB存储引擎的数据文件本身就是以聚簇索引的形式保存的。这个聚簇索引也被称为主索引,也就是主键。InnoDB表的每行数据都保存在主索引的叶子节点上。因此所有innoDB表都包含主键。如果创建表的时候没有显式的创建主键,那么InnoDB会隐式的创建一个长度为6个字符的long类型的字段作为主键。在InnoDB表中,除了主键之外的索引被称为辅助索引或者二级索引。

存储方式

InnoDB使用两种存储方式,共享表空间和多表空间存储
MySQL 5.7后默认使用多表空间存储

MEMORY

MEMORY存储引擎的数据都是存在于内存中的,因此他的访问速度非常快。但是一旦服务重启,数据将会丢失。

MERGE

MERGE表是一组MyiSam表的集合,这些MyiSam表的结构必须完全一致。可以在MERGE表中进行CRUD操作。通过INSERT_METHOD来设置插入规则,不写默认为NO,表示不允许插入。LAST为在最后一个表插入。FIRST为在第一个表插入。MERGE在磁盘上保存两个文件。.frm文件存储表的定义。.MRG文件存储组合表的信息。
例子如下图所示:
在这里插入图片描述

在这里插入图片描述

TokuDB

TokuDB是一种第三方的存储引擎。相比于InnoDB他拥有更高的压缩率(高近10倍)。插入性能高。支持在线DDL操作。可以快速加载大量数据。提供了主从延迟消除技术。支持ACID和MVCC。

数据库中数据类型的选择

Char VarChar

Char和VarChar都是用来存储字符串类型的。他俩的区别就是前者是定长的后者是变长的。VarChar存储所用的字节要比实际需要的多1-2个(用来存储字符串实际长度,当存储255个字符以下时需要1个字节。多余255需要2个字节)。虽然VarChar为变长的字符串类型。但是定义时也不要定义一个很大的长度。因为如果定义一个远超实际需求的VarChar可能影响应用程序的效率,并有更大的概率触发mysql在varchar上的bug。
char会自动去掉结尾的空格。
MyISAM:建议使用char
MEMORY:char和Varchar都相当于char
InnoDB:建议使用Varchar。因为InnoDB内部的存储格式没有区分定长和变长(所有数据行都是用一个指针指向数据列值得头指针)。因此使用char并不会因为定长从而加快查询速度。反而会因为是定长的从而浪费更多的空间。

Text和Blob

Text和Blob是用来存储长字符串的。他俩的区别在于Blob可以存储二进制数据(如图片)。Text和Blob在进行删除操作时会留下很大的空洞。不仅会造成空间上得浪费。同时会影响数据插入这些空洞时得性能。可以通过经常通过Optimize table xxx来进行整理,从而消除空洞得影响。
可以通过合成索引来加快大文本的查询速度。合成索引就是通过MD5()或者SHA1()来生成一段哈希值,从而加快查迅速的。但是合成索引只能用于精确查询。范围查询和模糊查询则没有作用,
create index 索引名 on表名(字段名)
可以通过建立前缀索引来提高模糊查询的速度(%要写在后面)
create index 索引名 on表名(字段名(x)) x代表前缀对的长度

浮点数和定点数

浮点数(double float)和定点数(decimal)都会进行四舍五入。定点数实际上是用字符串的形式存放的。由于浮点数的特性,浮点数可能会出现误差,但是定点数不会出现。当用来存储一些比较精确的数据时最好使用定点数。

日期类型

根据实际情况选择占空间最小的类型即可。
如果需要满足不同时区的需求,那么就要使用TimeStamp
如果要存放的日期比较久远,那么就要使用DateTime

猜你喜欢

转载自blog.csdn.net/qq_30033509/article/details/114376865