文章目录

  • 存储引擎
  • 不同引擎的数据库文件
  • 数据类型
  • 约束


存储引擎

存储引擎就是存储的机制,数据按照什么方式存储,怎么存

查看所有存储引擎show engines\G

  • 概念:
  • 事务:
    操作一些列sql语句,只有都执行成功才算成功
    有一个不成功,就恢复到最初始状态,这个过程是事务.
  • 表级锁:
    有1个人修改这张表,就会上锁,其他人不能修改
    特点 : 内存开销小,不支持并发
  • 行级锁:
    有1个人修改这张表中的一条记录,这条数据就会上锁,其他人不能改
    特点 : 内存开销大,支持并发
  • 外键:
    把多张表通过一个字段关联在一起,叫做外键
  • 种类:
  • InnoDB :
    5.6之后默认的存储引擎
    特点 : 支持事务,行级锁,外键
  • MyISAM :
    5.6之前默认的存储引擎
    特点 : 表级锁
  • MEMORY :
    用内存来存储数据(缓存) [目前更多使用的是redis数据库来取代]
    特点 : 速度快,不能进行持久化存储
  • BLACKHOLE:
    黑洞 ,用作同步数据的一种引擎方式[主从数据库集群]
    特点 : 所有数据不会写入,但是会提示成功.
  • BLACKHOLE使用场景:
  • python存储对象的集合 python存储类型_数据

  • 如图:用户访问网站时,先通过负载均衡系统
    来进行用户的分发,底层会用一系列类似于取模的算法,给用户进行分配,目的让服务器所抗住的并发均衡;
    有的用户需要查询,有的用户需要修改或者添加,但是整体查询次数会远远大于增删改的次数,
    那么这时搭建主从数据库.主数据库负责写入,从数据库负责读取,
    为了让主从数据库,数据同步,中间在加上一台服务器,用于同步,那么这台服务器所用的存储引擎就是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