存储引擎

  数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

  可以简单的理解为是处理同一数据的不同方式。

MySQL主要存储引擎

    MyISAM

  MySQL5.5之前的默认存储引擎,数据的存储速度较InnoDB更加快。

    InnoDB

  MySQL5.5之后的默认存储引擎,具有事务,行级锁,和外键的功能,数据的安全性更高,数据的存储速度较慢

    memory

  基于内存存储数据,速度最快,但是断电后会立刻丢失

    blackhole

  使用该引擎写入数据会立马消失,类似于垃圾处理站

presto存储引擎 存储引擎的作用是什么_presto存储引擎

 

 

 

不同引擎创建表的区别

# 创建不同的表
create table t1(id int) engine=myisam;
create table t2(id int) engine=innodb;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
"""
MyISAM会创建三个文件
   .frm      表结构文件
   .MYD    表数据文件
   .MYI    表索引文件(索引是用来加快数据查询的)
InnoDB会创建两个文件
   .frm     表结构文件
   .ibd     表数据和表索引文件
memory
   .frm     表结构文件
blackhole
   .frm     表结构文件
"""

presto存储引擎 存储引擎的作用是什么_主键_02

 

 

 

 

严格模式

# 针对MySQL5.6版本数据超出范围不会报错 而是自动帮你截取并保存(此行为不合理)
    方式1:修改配置文件(永久)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
    方式2:命令修改(暂时)
        show variables like '%mode%'
        set session  # 当前窗口有效
        set global  # 当前服务端有效
            set gloabl sql_mode = 'strict_trans_tables'
        修改完毕后退出客户端重新进入即可
    再次执行上述插入命令 会直接报错

 

基本数据类型

整型

分类:tinyint,smallint,int,bigint

区别:不同的int类型能够储存的范围是是不一样的,bigint>int>smallint>tinyint

'''研究默认是否需要正负号'''
        create table t1(id tinyint);
        insert into t1 values(-999),(999);
 # 结论:所有的int类型默认都需要正负号
        create table t6(id tinyint unsigned);  # 移除正负号
        insert into t6 values(-999),(999);
整型中括号内数字的作用
id int(8)
    如果数字没有超出8位 那么默认用空格填充至8位
    如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位

# 总结:
针对整型字段 括号内无需指定宽度 因为它默认的宽度以及足够显示所有的数据了

 

 

presto存储引擎 存储引擎的作用是什么_presto存储引擎_03

 

 

 

浮点型

分类:float,double,decimal
区别:三者的精确度不同,float
float(255,30)  # 总共255位 小数位占30位
double(255,30)  # 总共255位 小数位占30位
decimal(65,30)  # 总共65位 小数位占30位
"""研究三者的不同"""
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
insert into t7 values(1.11111111111111111111111);
insert into t8 values(1.11111111111111111111111);
insert into t9 values(1.11111111111111111111111);

presto存储引擎 存储引擎的作用是什么_mysql_04

 

 

 

 

字符类型

char:定长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便会使用空格填充到定义的长度。
    优点:数据存取方便,速度快
    缺点:浪费了存储空间
varchar:变长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便有几个存几个。
    优点:节省了存储空间
    缺点:数据存取麻烦,需要有1bytes来先制作报头,然后获取报头再获取数据。
mysql> create table t1(name char(5));
mysql> create table t2(name varchar(5));
mysql> insert into t1 values('jjk');
mysql> insert into t2 values('jjk');
# char类型里的数据在取出时会自动消除空格 可以设置以下语句取消
 set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'

presto存储引擎 存储引擎的作用是什么_数据_05

给字段增加注释
# 增加注释
mysql> create table t2(id int comment '序号');
# 查看注释
mysql> show create table t3;

presto存储引擎 存储引擎的作用是什么_mysql_06

 

 

 

 

枚举与集合

枚举:设置字段的时候有多个选项,只能从这个几个选项中选择一个
集合:设置字段的时候有多个选项,可以选择一个或者多个
# 设置枚举
mysql> create table t1(gender enum('男','女'));
# 设置集合
mysql> create table t2(hobby set('篮球','足球','网球'));

# 给表中加入记录
mysql> insert into t1 value('男'); # 成功
mysql> insert into t1 value('女'); # 成功
mysql> insert into t1 value('man');# 报错

mysql> insert into t2 values('篮球,网球,足球'); # 成功
mysql> insert into t2 values('足球'); # 成功

presto存储引擎 存储引擎的作用是什么_主键_07

 

 

 

 

时间类型

分类:
date:年月日
datatime:年月日时分秒
time:时分秒
year:年份
mysql> create table t1(time datetime);
mysql> insert into t1 values('2022-2-18 19:20:20');

presto存储引擎 存储引擎的作用是什么_mysql_08

 

 

 

 

 

创建表的完整语法

create table 表名(
    字段名1 字段类型(数字) 约束条件,
    字段名2 字段类型(数字) 约束条件,
    字段名3 字段类型(数字) 约束条件
);
"""
1.字段名和字段类型是必须的
2.数字和约束条件是可选的 并且 约束条件可以有多个空格隔开即可
3.最后一个语句的结尾不要加逗号
"""

presto存储引擎 存储引擎的作用是什么_主键_09

 

 

 

 

约束条件

unsigned:让数字没有负数

mysql> create table t1(id int unsigned);
mysql> insert into t1 values(-100);  # 报错
mysql> insert into t1 values(100);

presto存储引擎 存储引擎的作用是什么_主键_10

presto存储引擎 存储引擎的作用是什么_主键_11

 

 

 

 zerofill:当字段类型是char时,输入的值小于设定的字节时,使多余的部分使用数字0填充

mysql> create table t2(name int zerofill);
mysql> select * from t2;

presto存储引擎 存储引擎的作用是什么_presto存储引擎_12

 

 

 

not null:非空,当表中的记录为空时就会报错

"""
    新增表数据的方式
        方式1:  按照字段顺序一一传值
             insert into t1 values(1,'jack');
        方式2:  自定义传值顺序 甚至不传
            insert into t1(name,id) values('jack',1);
            insert into t1(id) values(1);
    在MySQL中不传数据 会使用关键字NULL填充意思就是空 类似于python的None
"""
mysql> create table t3(id int, name char(6) not null );

mysql> insert into t3(id) values(2); # 报错
mysql> insert into t3(id,name) values(2,'jack'); #添加成功

 

default:设置默认值,如果没有输入则使用默认值,输入值就使用输入的值

mysql> create table t5(id int,name char(5),
gender enum('male','female') default 'male'); # 创建表

mysql> insert into t5(id,name) values(1,'xk'); # 添加记录

mysql> select * from t5; # 查看表记录

presto存储引擎 存储引擎的作用是什么_数据_13

 

 

 

unique:唯一值,设置了该条件表中不能出现与该数据相同的数据

# 单列唯一
mysql> create table t6(id int unique); # 创建表
mysql> insert into t6 values(1);  # 添加成功
mysql> insert into t6 values(1);  # 报错


#联合唯一
mysql> create table t7(id int, name char(5),unique(id,name));
mysql> insert into t7 values(1,'abc'); # 添加成功
mysql> insert into t7 values(1,'asd'); # 添加成功
mysql> insert into t7 values(2,'asd'); # 添加成功
mysql> insert into t7 values(1,'abc'); # 报错

 

primary key:主键

  单从约束条件上来讲,主键的功能相当于not null + unique(非空且唯一),在此基础上还可以加快数据的查询

  InnoDB引擎规定了一张表有且只有一个主键

  如果在创建表的时候没有设置主键,InnoDB引擎会采用隐藏的字段称为主键,该情况不能加快数据的查询

  如果某个字段拥有非空且唯一的约束条件,并且从上至下是最上面的位置,那么该字段就会自动升级成主键

create table t6(
                    id int,
                    age int not null unique, # 该键会称为主键
                    pwd int not null unique
                );

  结论:我们在创建表的时候应该主动设置一个主键,一般情况都会将表的id字段设置为主键

 

auto_increment:自增

  在设置id字段的时候,一般都是以数字慢慢增加,该约束条件可以帮助我们不需要手动输入id值,系统会自动帮我们记录。

mysql> create table t8(id int primary key auto_increment,
 name varchar(32)); # 创建表

mysql> insert into t8(name) values('xk'),('xzj'),('jrm'); # 添加记录


mysql> select * from t8; # 查看表记录

presto存储引擎 存储引擎的作用是什么_主键_14

 

 自增的特性

  自增不会因为删除操作而回退

# 删除记录
mysql> delete from t8 where id=1; 
mysql> delete from t8 where id=3;
# 添加记录
mysql> insert into t8(name) values('xk');
mysql> insert into t8(name) values('jrm');
# 查看记录
mysql> select * from t8;

presto存储引擎 存储引擎的作用是什么_mysql_15

 

 重置自增

  重置自增需要使用truncate关键字

# truncate 表名    清空表数据并且重置主键值
truncate t8;
查找记录
select * from t8; # Empty set (0.00 sec) 没有数据
# 添加记录
mysql> insert into t8(name) values('xk');

presto存储引擎 存储引擎的作用是什么_数据_16