文章目录
- 存储引擎
- 不同引擎的数据库文件
- 数据类型
- 约束
存储引擎
存储引擎就是存储的机制,数据按照什么方式存储,怎么存
查看所有存储引擎show engines\G
- 概念:
- 事务:
操作一些列sql语句,只有都执行成功才算成功
有一个不成功,就恢复到最初始状态,这个过程是事务. - 表级锁:
有1个人修改这张表,就会上锁,其他人不能修改
特点 : 内存开销小,不支持并发 - 行级锁:
有1个人修改这张表中的一条记录,这条数据就会上锁,其他人不能改
特点 : 内存开销大,支持并发 - 外键:
把多张表通过一个字段关联在一起,叫做外键
- 种类:
- InnoDB :
5.6之后默认的存储引擎
特点 : 支持事务,行级锁,外键 - MyISAM :
5.6之前默认的存储引擎
特点 : 表级锁 - MEMORY :
用内存来存储数据(缓存) [目前更多使用的是redis数据库来取代]
特点 : 速度快,不能进行持久化存储 - BLACKHOLE:
黑洞 ,用作同步数据的一种引擎方式[主从数据库集群]
特点 : 所有数据不会写入,但是会提示成功.
- BLACKHOLE使用场景:
- 如图:用户访问网站时,先通过负载均衡系统
来进行用户的分发,底层会用一系列类似于取模的算法,给用户进行分配,目的让服务器所抗住的并发均衡;
有的用户需要查询,有的用户需要修改或者添加,但是整体查询次数会远远大于增删改的次数,
那么这时搭建主从数据库.主数据库负责写入,从数据库负责读取,
为了让主从数据库,数据同步,中间在加上一台服务器,用于同步,那么这台服务器所用的存储引擎就是blackhole
专门帮助主数据库进行binlog日志的生成和分发.从数据库拿到binlog日志后,开始同步自己的数据
这样的好处,主数据库只专注于写入,不用考虑分发其他数据等操作;减少服务器的压力;
中间blackhole的mysql服务器不需要生产或者消费数据,只是单纯的过滤生产binlog日志,所以选择blackhole存储引擎.
不同引擎的数据库文件
create table innodb1(id int , name char(4)) engine=innodb;
show create table innodb1;
innodb1.frm
表结构innodb1.ibd
表数据
create table myisam1(id int ,name char(4)) engine=myisam;
myisam1.frm
表结构myisam1.MYD
表数据myisam1.MYI
表索引 从上到下,从左到右依次查询,如果设置该字段是索引,会单独拿出来一个文件进行存储查询,速度更快.
create table memory1(id int ,name char(4)) engine=memory;
memory1.frm
表结构
create table blackhole1(id int ,name char(4)) engine=blackhole;
blackhole1.frm
表结构
insert into blackhole1 values(1,"s");
# 没有数据
数据类型
- 整型:
tinyint 1个字节 有符号(-128 ~ 127) 无符号(0~255) 小整数值
int 4个字节 有符号(-21亿 ~ 21亿 最大长度10位) 无符号(0~42亿) 大整数值,精确度更高
create table t1(id int unsigned,sex tinyint);
insert into t1 values(4200000000,128); #22003): Out of range value for column 'sex' at row 1
insert into t1 values(4200000000,127);
- 浮点型:
float(255,30) 单精度
double(255,30) 双精度
decimal(65,30) 一般用于保存金钱,是使用字符串的形式来保存小数,
create table t2(f1 float(5,2) , f2 double(5,2),f3 decimal(5,2));
insert into t2 values(1.234,1.234,1.234);
# decimal 默认保留整数 double默认保留的小数位数更多,更精确.
create table t3(f1 float, f2 double,f3 decimal);
insert into t3 values(1.2355555555,1.2355555555,1.2355555555);
- 字符串:
char(11) 定长:固定开启字符长度是11的空间 (手机号,身份证号),速度快
varchar(11) 变长:最大开辟字符长度是11的空间 (文章评论 5~255个字数之间.),速度慢
text 这种类型应用在文章,小说中.
create table t4(c char(11),v varchar(11),t text);
insert into t4 values('1122',"dfdffd","34234234243");
select concat(c,v) from t4;
select concat(c,",",v) from t4;
- 时间类型:
date YYYY-MM-DD 年月日 (出生日期)
time HH:MM:SS 时分秒 (竞赛时间)
year YYYY 年分值 (红酒82年拉菲 82年矿泉水)
datetime YYYY-MM-DD HH:MM:SS 年月日时分秒 (登录时间,下单时间)
create table t5(d date ,t time ,y year ,dt datetime);
insert into t5 values(now(),now(),now(),now());
insert into t5 values("2020-1-1","23:23:23","2038","2099-1-1 23:23:23");
timestamp YYYYMMDDHHMMSS 自动更新时间戳,不需要你手动写入(修改表的时候,自动更新,到时候可以看到最后一次表更新时间;)
create table t6(dt datetime,ts timestamp);
insert into t6 values(null,null);
insert into t6 values(20190103121212,20190103121212);
insert into t6 values(20190103121212,20380118121212);
- enum 和 set 的数据必须从其中挑选,没有的话报错;
enum 枚举 从一组数据中选一个 (一般性别上)
set 集合 从一组数据中选多个 ,自动去重 - mysql 内置的函数
concat(参数1,参数2…) 把所有的参数拼接在一起
now() 获取当前时间
约束
对插入数据库的值进行限制,不满足条件的不让操作数据.
unsigned : 无符号整型
not null : 不能为空
default : 设置默认值
unique : 唯一约束,数据唯一,不重复
primary key : 主键,唯一不为空的值.可以唯一表达每条记录[辨别数据唯一性的一个身份证]
auto_increment : 自增加1,[一般是对unique或者 primary key 进行设置]
foreign key : 外键,把多张表通过一个字段关联在一起
zerofill : 零填充,位数不够的时候用前导0
- not null: 不能为空
create table t7(id int not null,name varchar(255));
insert into t7 values(1,null);
- default : 设置默认值
create table t8(id int not null,name varchar(255) default "wangwen" );
# insert into t8 values(2,null);
# 特别指定id字段插入,另一个字段使用默认值;
insert into t8(id) values(3);
- unique : 唯一约束,数据唯一,不重复,unique 默认允许插入空值
create table t9(id int unique,name char(12) default 'lisi');
insert into t9(id) values(1);
# insert into t9(id) values(1); # error
insert into t9(id) values(null);
insert into t9(id) values(null);
- primary key: 主键,唯一不为空的值.可以唯一表达每条记录[辨别数据唯一性的一个身份证]
# 原型:create table t10(id int not null unique,name char(10) default '马军强');
# primary key 可以直接指定主键;
create table t11(id1 int not null unique,id2 int primary key );
desc t11;
create table t12(id int primary key,name varchar(20) default "张国成");
desc t12
insert into t12(id) values(1);
insert into t12(id) values(null);
- auto_increment: 自增加1,[一般是对unique或者 primary key 进行设置]
create table t13(id int primary key auto_increment , name varchar(10) default '熊卫华');
insert into t13 values(5,"aabb");
insert into t13 values(null,'ccdd');
- 清空数据,id号保留;
delete from t2
- 清空数据,id号重置;(速度更快)
truncate table t2