存储引擎
存储引擎
MySQL内部针对数据的存储有很多种不同的方式
简单的理解:我们把这些不同的存储方式叫做不同的存储引擎
如何查看各类存储引擎
show engines;
主要存储引擎
InnoDB
MySQL5.5之后的版本默认的存储引擎
支持事务、行锁、外键>>>数据更安全
事务:保证多个数据的操作要么全部完成要么全部失败
行锁:多一行行数据加锁,同一时间只能有一个人操作
外键:建立表关系
MySAM
MySQL5.5之前的版本默认的存储引擎
不支持事务,外键等功能>>>安全性较于InnoDB低
但是存取数据的速度比InnoDB快
memory
数据直接存储在内存,速度快但是断电立刻丢失
blackhole
写入其中的数据都会丢失
存储引擎表文件
create table t1(id int) engine=InnoDB;
create table t2(id int) engine=MyISAM;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
不同的存储引擎生成的文件数目也不同
1.InnoDB有两个文件
.frm 表结构
.idb 表数据、索引(书的目录)
2.MyISAM有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引
3.memory有一个文件
.frm 表结构
4.blackhole有一个文件
.frm 表结构
存储数据特性检验:
insert into t1 values(1); 正常存储
insert into t2 values(1); 正常存储
insert into t3 values(1); 重启MySQL后存储的文件丢失
insert into t4 values(1); 啥也没存储进去
创建表的完整语法
create table 表名(
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束类型,
字段名 字段类型(宽度) 约束条件
);
1.字段名和字段类型是必填的,宽度和约束条件是可选的
2.约束条件可选,并且一个字段可支持多个约束条件
3.最后结尾的字段语句不能有逗号
字段类型
整型
tinyint
smallint
int
bigint
(不同整型类型能够存储的数字范围不同)
验证整型是否自带正负号
create table t6(id tinyint);
insert into t6 values(-129),(256);
(其他类型也是如此,默认都是自带正负号)
create table t7(id tinyint unsigned); unsigned约束条件,无符号
insert into t7 values(-129),(256);
浮点型
float
double
decimal
(不同的浮点型存储小数的范围和精确度不一样)
float(255,30) 总共255位小数位占30位
double(255,30) 总共255位小数位占30位
decimal(65,30) 总共65位小数位占30位
create table t8(id float(255,30));
create table t9(id double(255,30));
create table t10(id decimal(65,30));
insert into t8 values(1.1111111111111111111111111111);
insert into t9 values(1.1111111111111111111111111111);
insert into t10 values(1.1111111111111111111111111111);
精确度:float<double<decimal
精确度问题在很多场景下都会发生,有时候我们会采取不同的类型来存储
eg:
比如手机号全部是数字存储的时候应该使用整型,但是有时候我们使用字符类型
字符类型
char
varchar
(上述两个数据类型在存储数据上有本质的区别)
char(4)
最多可以存储4个字符,超过了报错,没超过按照4个字符存储(默认空格填充)
varchar(4)
最多可以存储4个字符,错过了报错,没有超过按照实际有几个字符存几个
create table t11(id int,name char(4));
create table t12(id int,name varchar(4));
insert into t11 values(1,‘jaosn‘);
insert into t12 values(1,‘jaosn‘);
5.6版本超出了范围不会报错,因为没有看起严格模式(5.7及之后版本默认开启)
char_length() 统计数据长度
默认情况下MySQL会自动填充存储并在查询的时候自动去除填充的空格
set global
sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
思考题:char和varchar哪个更好
char
好处:整存整取,速度快
坏处:浪费存储空间
varchar
好处:节省存储空间
坏处:存取速度较于char慢
(存取数据都需要计算,消耗时间:
因为每个数据的字符数不是固定的
存取数据时会自动在每个数据前面加上1bytes用来表示这个数据的字节数
因此存取时每个数值都会花费1bytes的时间和存储空间)
结论:设定的总字节数大于数据字节数的时候varchar可以节约存储空间
但如果设定的总字节数和数据字节数差不多的时候char更好
严格模式
查看严格模式
show variables like ‘%mode%‘;
修改严格模式
set global sql_mode=‘strict_trans_tables‘;
需要退出客户端重新进入即可
时间类型
date 年月日
time 时分秒
Datetime 年月日时分秒
Year 年
create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
针对时间数据很多时候都是自动获取(了解)
insert into student values(1,‘jaosn‘,‘2022‘,‘2022-05-09‘,‘11:11:00‘,‘2022-11-11 11:11:11‘);
枚举与集合类型
enum
多选一
set
多选多(包含多选一)
枚举类型
create table t13(
id int,
name varchar(16),
gender enum(‘male‘,‘female‘,‘others‘)
);
(插入数据的时候只能够插入提前规定好的内容)
insert into t13 values(1,‘jaosn‘,‘男‘); 报错(不是规定内容)
insert into t13 values(2,‘tony‘,‘male‘);
集合类型
create table t14(
id int,
name char(16),
hobby set(‘basketball‘,‘football‘,‘doublecolorball‘)
);
(插入数据的时候只能够插入提前规定好的内容)
insert into t14 values(1,‘jaon‘,‘read‘); 报错(不是规定内容)
insert into t14 values(2,‘kevin‘,‘basketball‘); 可选一
insert into t14 values(3,‘tony‘,‘basketball,football‘); 可选多
宽度说明
int(4) char(4)
针对数字类型,宽度并不是用来限制存储长度而是用来表示展示长度
(平时在定义数字的是无需手动添加宽度)
约束条件
插入数据的两种方式
1.insert into t1 values() 按照字段顺序依次传入(一个都不能少)
2.insert into t1(id,name) values() 按照指定的字段传入(可以少)
unsigned 无符号
zerofill 用0填充
not null 不能为空,使用频率很高
create table t18(
id int,
name varchar(16) not null
);
default 默认值
create table t19(
id int,
name varchar(16) default ‘匿名用户‘
);
unique 唯一
1.单列唯一
create table t20(
id int,
name varchar(16) unique
);
(一列内不能输入重复的内容,不然会报错)
2.多列唯一
create table t21(
id int,
host int,
port int,
unique(host,port)
);
(一行内多个内容的组合不能重复,不然会报错,但单独列是可以重复的)