数据库存储引擎 SQL语言基本数据类型

存储引擎

什么是存储引擎

存储引擎<==============>表
视频播放器<=============>mp4 
文本编辑器<=============>txt

针对不同的数据应该有对应的不同的处理机制来存储
存储引擎就是Mysql软件中的一种插件,不同的存储引擎有着不同的处理机制

Mysql架构图解析

  • MySQL支持多种语言的接口,应用程序可以基于mysql的接口做开发。
  • 每一个应用程序基于接口向MySQL服务端发起一个请求,就相当于在MySQL服务端中的进程中起了一个线程。

在这里插入图片描述

查看数据库支持的所有搜索引擎:show engines;
mysql主要存储引擎,现在企业中默认的使用的数据库搜索引擎为:innodb

innodb
三大特点:事务,行级锁,外键
是mysql5.5版本之后默认的存储引擎
存储数据更加安全

myisam
是mysql5.5版本之前默认的存储引擎
支持全局检索(关键字查询),速度要比innodb更快 但是我们更加注重数据的安全

memory
内存引擎(数据全部存放在内存中)断电数据丢失

blackhole
无论存什么都立刻消失(黑洞
 

innodb搜索引擎的三大特点:

事务,顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻辑工作单元执行的一系列操作(SQL语句)。
这些操作要么全部执行,要么全部不执行。

行级锁,只针对当前操作的行进行加锁,行级锁能大大减少数据库操作的冲突,并发效率比较高。

MySQL设置表结构和数据文件分开

会员中心

收藏

动态

消息

创作中心

数据库存储引擎 SQL语言基本数据类型

存储引擎

什么是存储引擎

存储引擎<==============>表
视频播放器<=============>mp4 
文本编辑器<=============>txt

针对不同的数据应该有对应的不同的处理机制来存储
存储引擎就是Mysql软件中的一种插件,不同的存储引擎有着不同的处理机制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Mysql架构图解析

  • MySQL支持多种语言的接口,应用程序可以基于mysql的接口做开发。
  • 每一个应用程序基于接口向MySQL服务端发起一个请求,就相当于在MySQL服务端中的进程中起了一个线程。

在这里插入图片描述

查看数据库支持的所有搜索引擎:show engines;
mysql主要存储引擎,现在企业中默认的使用的数据库搜索引擎为:innodb

  1. innodb
    三大特点:事务,行级锁,外键
    是mysql5.5版本之后默认的存储引擎
    存储数据更加安全

  2. myisam
    是mysql5.5版本之前默认的存储引擎
    支持全局检索(关键字查询),速度要比innodb更快 但是我们更加注重数据的安全

  3. memory
    内存引擎(数据全部存放在内存中)断电数据丢失

  4. blackhole
    无论存什么都立刻消失(黑洞)

innodb搜索引擎的三大特点:

事务,顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻辑工作单元执行的一系列操作(SQL语句)。
这些操作要么全部执行,要么全部不执行。

行级锁,只针对当前操作的行进行加锁,行级锁能大大减少数据库操作的冲突,并发效率比较高。

外键(foregin key),表与表之间建关系。

MySQL设置表结构和数据文件分开

1. 我们需要在mysql服务端配置文件中加上配置项
vim /data/3307/my.cnf
[mysqld]
# 服务端需要加上配置项innodb_file_per_table=1,每个表都有自己独立的数据文件
# 不加这个参数,所有的数据都默认存入/data/3307/data/ibdata1文件中
innodb_file_per_table=1
...

2. 测试,我们在mysql3307实例中创建一个表数据
mysql3307
use t1;
create table test01(id int);

3. 我们切换到t1库对应的目录下,查看数据库生成的文件
ls /data/3307/data/t1/
# db.opt  test01.frm  test01.ibd
test01.frm 表结构(元数据) ; test01.ibd(数据文件)

查看所有的存储引擎:show engines;

用4种不同的存储引擎去建4张表
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;

打开对应的文件目录
ls /data/3307/data/test/
# t1.frm  t1.ibd  t2.frm  t2.MYD  t2.MYI  t3.frm  t4.frm

innodb: t1.frm  表结构
        t1.ibd    表数据,索引

myisam: t2.frm    表结构
        t2.MYD    表数据
        t2.MYI    索引(index),支持全局索引查询,速度更快

menory:t3.frm    表结构(数据在内存,无需文件存储)

blackhole:t4.frm    表结构(黑洞,不需要帮忙存数据)
 

数据库基本数据类型

创建表的完整语法

create table 表名(
    字段名1 类型(宽度) 约束条件,
    字段名2 类型(宽度) 约束条件
)

注意:
1.在同一张表中的字段名不能重复
2.宽度和约束条件是可选的(可写可不写),而字段名和字段类型是必须要写的
    约束条件写的话 支持写多个
3.最后一行不能有逗号

宽度:一般情况下指的是对存储数据的限制
约束条件:在宽度的基础之上增加额外的约束
 

严格模式

设置了严格模式后,字符或者整型超出范围会直接报错,而不会让数据库去自动截取数据。

严格模式针对不同的版本会出现不同的效果
如果没有开启严格模式,规定只能存一个字符你给了多个字符,那么我会自动帮你截取一个字符进行存储
如果开启了严格模式,那么规定只能存几个,就不能超,一旦超出范围就会立刻报错 Data too long for

  严格模式到底要不要开? 
  mysql5.7之后的版本都是默认开启严格模式的 
  使用数据库的准则:能尽量少让数据库干活就尽量少让数据库干活,不用给数据库增加额外的压力(提升数据库的查询效率)
设置严格模式
vim /etc/my.cnf
sql_mode=STRICT_TRANS_TABLES

查看当前数据库是否为严格模式
select @@sql_mode;

整型

注意:整型的存储宽度是规定好的(如下所示),只有整型的宽度指的是展示宽度!!!
其他的数据类型的宽度都是指的是存储宽度,所以我们在数据库中使用int类型创建数据通常不需要指定宽度。

TINYINT类型

  • 关闭严格模式进行测试

create table t5(id tinyint);        
insert t5 values(128);
# 默认情况下有符号,最大存储范围(-128,127)
select * from t5;
+------+
| id   |
+------+
|  127 |
|  127 |
+------+

create table t6(id tinyint unsigned);
insert t6 values(256);
# unsigned无符号模式(范围不够,默认使用0填充),最大存储范围为(0,255)
select * from t6;
+------+
| id   |
+------+
|  255 |
+------+

create table t7(id tinyint(10));
insert t7 values(100000);
# 指定好整型宽度后,我们插入数据,存储范围依然是(-128,127)
select * from t7;
+------+
| id   |
+------+
|  127 |
+------+
 

浮点型

指定浮点型的存储范围限制

  float(255,30)   总共255位 小数部分占30位
  double(255,30) 	 总共255位 小数部分占30位
  decimal(65,30) 		总共65位 小数部分占30位

三种浮点型的属性对比
mysql> create table t10(id float(255,30));
mysql> create table t11(id double(255,30));
mysql> create table t12(id decimal(65,30));


mysql> insert into t11 values(1.111111111111111111111111111111);
mysql> insert into t10 values(1.111111111111111111111111111111);
mysql> insert into t12 values(1.111111111111111111111111111111);


select * from t10;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+

select * from t11;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+

select * from t12;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+


浮点型数据存储的精确度: float < double < decimal

日期类型

常见的日期类型

  reg_time datetime                 格式(2020-11-11 11:11:11)
  class_time time                     格式(08:30:00)
  born_year date                     格式(2008)
  timestamp                            格式(2020-11-11 11:11:11)

reg_time datetime 与 timestamp 的差别 :

    reg_time datetime的日期范围是1001-9999年,timestamp的时间范围是1970-2038年。
    reg_time datetime使用8个字节的存储空间,timestamp的存储空间为4个字节,因此timestamp空间利用率更高,数据库的io效率更高
    reg_time datetime默认值为null;timestamp的字段默认不为空(not null),默认为当前时间。

常见日期类型的属性对比
create table t15(
id int,
name varchar(10),
reg_time datetime,
class_time time,
born_year date
);

insert t15 values(1,"nana","2020-11-11 11:11:11","08:30:00","2008");

desc t15;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| name       | varchar(10) | YES  |     | NULL    |       |
| reg_time   | datetime    | YES  |     | NULL    |       |
| class_time | time        | YES  |     | NULL    |       |
| born_year  | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

select * from t15;
+------+------+---------------------+------------+------------+
| id   | name | reg_time            | class_time | born_year  |
+------+------+---------------------+------------+------------+
|    1 | nana | 2020-11-11 11:11:11 | 08:30:00   | 0000-00-00 |
+------+------+---------------------+------------+------------+

reg_time datetime 与 timestamp 的对比
# timestamp占用表的空间小,查询效率更高
create table t16(id timestamp);

# 默认timestamp字段不为空
desc t16;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+

# 插入空数据
insert into t16 values();

# 默认生成当前时间
mysql> select * from t16;
+---------------------+
| id                  |
+---------------------+
| 2021-07-01 10:21:49 |
+---------------------+

字符类型

字符类型分为char和varchar两种类型

char 定长

char(4)
数据超过四个字符直接报错;字符不够四个字符空格补全
a |ab |abc |abcd|

varchar 变长

varchar(4)
数据超过四个字符直接报错;字符不够有几个字符存几个字符
1bytes+a|1bytes+ab|1bytes+abc|1bytes+abcd|

当我们存储的数据小于四个字节,varchar占用空间更小(三个字节var与varchar占用的数据库空间是一样的)
当我们存储的数据大于或等于四个字节,char占用空间更小
符合需求的前提下,我们在设计表创建数据类型的时候,应该尽量让数据占用表更小的空间,主要是为了优化数据的io速度!!!

create table t18(name char(4));
create table t19(name varchar(4));

insert into t18 values("a");
insert into t19 values("a");

mysql显示的数据的时候mysql默认会将多余的空格操作剔除
vim /etc/my.cnf
[mysqld]
# 添加配置项,让mysql不要自动剔除操作
sql_mode=PAD_CHAR_TO_FULL_LENGTH        

# 统计字段长度
select char_length(name) from t18;      
+-------------------+
| char_length(name) |
+-------------------+
|                 4 |
+-------------------+

select char_length(name) from t19;
+-------------------+
| char_length(name) |
+-------------------+
|                 1 |
+-------------------+
总结

char

缺点:浪费空间
优点:存取都很简单
           直接按照固定的字符存取数据即可

varchar

优点:节省空间
缺点:存取较为麻烦
          1bytes+nana 
          存的时候需要制作报头
          取的时候也需要先读取报头,之后才能读取真实数据

枚举与集合

枚举(enum);全称:enumerate

  属性:多选一
  注意:枚举不能选多个,也不能选没有定义过的数据

集合(set)

  属性:多选多
  注意:集合可以多选多,但是不能选没有定义过的数据

create table teacher(
id int,
name char(16),
gender enum("male","female","other"),
hobby set("read","run","basketball")
);

insert into teacher values(2,"dudu","male","basketball,run");

select * from teacher;
+------+------------------+--------+----------------+
| id   | name             | gender | hobby          |
+------+------------------+--------+----------------+
|    2 | dudu             | male   | run,basketball |
+------+------------------+--------+----------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值