ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL基础学习(二)——常见的存储引擎和数据类型

2022-01-08 20:05:51  阅读:111  来源: 互联网

标签:存储 字节 MySQL 数据类型 00 引擎 mysql 类型


前言

上一篇mysql基础学习,简单总结了mysql数据库设计的几个步骤,以及每个步骤要做的事情,但是针对最为关键的物理设计并没有过多提及,因为物理设计部分涉及数据库存储引擎的选择,数据表中字段类型的选择,这些内容较多,这里单独开一篇博客来进行总结

物理设计要做的事情

数据库物理设计阶段,其实就是根据所选择的关系型数据库的特点,对逻辑模型进行存储结构设计。在mysql中,物理设计中有如下几个事情要完成

1、定义数据库、表及字段的命名规范

2、选择合适的存储引擎

3、为表中的字段选择合适的数据类型

4、建立数据库结构

说白了,就是将逻辑模型,落地成数据库表。这里最为关键的就是存储引擎的选择和表中字段数据类型的选择。至于所谓的命名规范,这里不做提及。

mysql的存储引擎

存储引擎是作用于具体的数据表的,不是某个数据库。mysql其实支持同一数据库中不同的表,采用不同的存储引擎,但是一般不建议这么操作。

MyISAM

特点

mysql5.5之前版本默认的存储引擎,也是mysql大部分系统表和临时表所使用的存储引擎这里说的临时表,不是我们手动建立的临时表,而是在排序,分组等操作中,当数量超过一定大小之后,由查询优化器建立的临时表

MyISAM存储引擎的数据表存储的文件,由MYD和MYI组成,MYD存储的是表中的数据内容,而MYI是存储表的索引。

MyISAM使用的是表级锁,不是行级锁,对表中数据修改的时候,会对表增加表级排他锁,读取表中的数据的时候,需要增加共享锁。

MyISAM不支持事务

MyISAM支持全文索引支持对text和blob字符支持前500个字符的前文索引,并且支持数据压缩(对于数据不怎么变化的表,压缩是一个不错的选择),压缩之后的表,只能读取,无法被修改。

适用场景

可适用于非事务的应用,只读类型的应用,空间类(比如存储GPS数据)的应用。

Innodb

MySQL5.5之后的默认存储引擎。

InnoDB引擎的数据表,存储数据根据innodb_file_pre_table变量的值不同而有所差异,如果innodb_file_pre_table为ON ,则InnoDB存储引擎的数据表数据会存储在独立的表空间中,一般为tablename.ibd文件,如果innodb_file_pre_table为OFF,则数据会存储在系统表空间中,一般存储于ibdataX文件(X为数字)中,这个时候所有的InnoDB引擎的数据表中的数据,都会存储于这种文件中。使用InnoDB存储引擎的数据表,强烈建议使用独立的表空间来存储数据

InnoDB支持事务为了能够实现事务的ACID属性,InnoDB采用了Redo log和Undo log日志类型

Redo log主要用于实现日志的持久性,在数据库中一般存储文件名为ib_logfileX(X为数字),mysql中有两个参数来配置Redo log的文件buffer大小和文件个数,innodb_log_buffer_size,这个参数就是mysql中配置的Redo log的缓冲区大小,基本每隔1秒,mysql就会将缓冲区中的内容刷新到磁盘,因此一般不用配置的太大。innodb_log_files_in_group决定了ib_logfilex的文件个数。

Undo log主要用于帮助未提交事务进行回滚,和实现mvcc多版本并发控制,Redo log存储的是已提交的事务,而Undo log存储的是未提交的事务。

InnoDB支持行级锁。行级锁可以最大程度的支持并发,行级锁是在存储引擎层实现的。数据库中的锁主要用户管理共享资源的并发访问,也用于实现事务的隔离性。

InnoDB提供了状态检查工具,可以通过show engine innodb status 命令来查看当前的引擎状态。

适用场景

可以使用与大多数的线上应用场景,无论是否有事务支持,在mysql5.7之后,innodb也支持全文索引和空间数据了。

CSV

特点

这种存储引擎数据存储格式就是CSV文件格式,数据是以文本方式存储在文件中,这点不同于MyISAM存储引擎和InnoDB存储引擎,其数据文件可以在数据库运行的时候,单独拷贝出来进行操作

以CSV格式进行数据存储。所有列必须都是非空的

CSV存储引擎不支持索引。不适合大表,不适合在线处理。

支持对数据文件直接编辑,这点也是其他存储引擎做不到的。

适用场景

非常适合作为数据交换的中间表,在不同系统之间可以用作CSV来进行数据交换。

Archive

特点

Archive引擎会缓存所有的写操作。以zlib对表数据进行压缩,磁盘I/O较小,数据存储在ARZ为后缀的文件中。

只支持insert和select操作,支持行级锁和专用的缓冲区,可以满足高并发的要求。

不支持事务,只允许在自增id列上建立索引

适用场景

比较适合用于日志和数据采集类的应用,因为不支持对数据的删除和修改操作,同时存储所用空间小。

Memory

特点

也称为HEAP存储引擎,所有数据都是存储在内存中的,一旦mysql数据库服务器重启,则数据全部丢失,但是表结构还是存在的(因为表结构是保存在磁盘中)

支持Hash索引和BTree索引,默认为Hash索引

所有字段的存储都为固定长度,比如,定义varchar(10)的字段,也会转换为char(10)

不支持BLOB和TEXT等大字段类型

使用表级锁,不支持行级锁

表的最大大小,由参数max_heap_table_size参数决定,这个参数的修改对存量表不生效。

适用场景

用于查找表,或者映射表,比如邮编和地址。

用于保存数据分析中产生的中间表

适用于缓存周期性聚合数据的结果表

Federated

特点

提供了访问远程mysql服务器上表的方法,本地不存储数据,数据会放到远程服务器上,本地需要保存远程表的结构信息和连接信息

mysql默认是禁止该存储引擎的。

使用场景

用于偶尔的统计分析以及手工查询的场景。

如何选择存储引擎

大部分情况可以直接选择innodb存储引擎,除非真的有innodb不支持的场景,才选择其他存储引擎。

mysql的数据类型

在mysql数据库设计的第二步,就是为每一个表字段选择合适的数据类型,mysql中数据类型大体上分为整数类型、实数类型、时间类型、字符串类型

整数类型

mysql中每一种整数类型,以及适用的数据大小范围,都如下表所示

列类型存储空间属性取值范围
tinyint1字节SIGNED-128~127
UNSIGNED0~255
smallint2字节SIGNED-32768~32767
UNSIGNED0~65535
mediumint3字节SIGNED-8388608~8388607
UNSIGNED0~16777215
int4字节SIGNED-2147483648~2147483647
UNSIGNED0~4294967295
bigint8字节SIGNED-9223372036854775808~9223372036854775807
UNSIGNED0~18446744073709551615

实数类型

存储小数,需要用到实数类型

列类型存储空间是否精确类型
FLOAT4字节
DOUBLE8个字节
DECIMAL每4个字节存9个小数,小数点占1个字节

所谓的不精确,是指小数部分存储的并不很精确,关于decimal举一个如下的实例

123456789.123456789=decimal(18,9) ##占用9字节(小数点前9位数,占用4个字节,小数点后也是四个字节,小数点1个字节,共9个字节)

时间类型

mysql中常用的时间类型有5种

列类型存储空间格式范围
DATE3字节YYYY-MM-DD从'1000-01-01'到'9999-12-31'
TIME3~6字节HH:MM:SS.[微妙值]从'-838:59:59'到'838:59:59'
YEAR1字节YYYY从'1901'到'2155'
DATETIME5~8字节YYYY-MM-DD HH:MM:SS[.微秒值]从'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
TIMESTAMP4~7字节YYYY-MM-DD HH:MM:SS[.微秒值]从'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC

关于上表中的微秒值,由于微秒最长会有6位,不同长度的微秒值占用的存储空间不同

微秒位数存储空间
00字节
1,21字节
3,42字节
5,63字节

我们通常定义指定长度的time类型,就是可以根据指定的长度不同,存储的微秒位数不同

比如:

实例1time18:00:00
实例2time(2)18:00:00:78
实例3time(4)18:00:00:7812
实例4time(6)18:00:00:781216

字符串类型

类型范围说明
char(M)M=1~255个字符固定长度
varchar(M)一行中所有varchar类型的列所占用的字节数不能超过65535个字节。UTF8mb4 varchar(10)=40字节存储可变长度的M个字符
tinytext最大长度255个字节可变长度
text最大长度65535个字节可变长度
mediumtext最大长度16777215个字节可变长度
longtext最大长度4294967295个字节可变长度
enum集合最大数目为65535只能插入列表中的值

总结

简单梳理了一下mysql的存储引擎和数据类型

标签:存储,字节,MySQL,数据类型,00,引擎,mysql,类型
来源: https://blog.csdn.net/liman65727/article/details/122385374

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有