数据库存储引擎 SQL语言基本数据类型
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库存储引擎 SQL语言基本数据类型相关的知识,希望对你有一定的参考价值。
存储引擎
什么是存储引擎
存储引擎<==============>表
视频播放器<=============>mp4
文本编辑器<=============>txt
针对不同的数据应该有对应的不同的处理机制来存储
存储引擎就是mysql软件中的一种插件,不同的存储引擎有着不同的处理机制
Mysql架构图解析
- MySQL支持多种语言的接口,应用程序可以基于mysql的接口做开发。
- 每一个应用程序基于接口向MySQL服务端发起一个请求,就相当于在MySQL服务端中的进程中起了一个线程。
查看数据库支持的所有搜索引擎:show engines;
mysql主要存储引擎,现在企业中默认的使用的数据库搜索引擎为:innodb
innodb
三大特点:事务,行级锁,外键
是mysql5.5版本之后默认的存储引擎
存储数据更加安全myisam
是mysql5.5版本之前默认的存储引擎
支持全局检索(关键字查询),速度要比innodb更快 但是我们更加注重数据的安全memory
内存引擎(数据全部存放在内存中)断电数据丢失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 |
+------+------------------+--------+----------------+
以上是关于数据库存储引擎 SQL语言基本数据类型的主要内容,如果未能解决你的问题,请参考以下文章