存储引擎:
可以理解为存储数据的方式不一样
查看所有的存储引擎
show engines;
需要掌握的
MyISAM
MySQL5.5及之前版本默认的存储引擎。
存取数据的速度都非常快,但是功能较少,安全性低。
InnoDB
MySQL5.6及之后版本默认的存储引擎
存储数据的速度没有MyISAM快,但是功能多,安全性高。
事务 行锁 外键
BlackHole
类似于垃圾场,往里面写入的任何数据都会消失。
Memory
内存存储数据
验证:
create table t1(id int) engine = InnoDB;
create table t2(id int) egine = MyISAM;
create table t3(id int) egine = BlackHole;
create table t4(id int) egine = Memory;
#文件个数不一致
InnoDB
.frm 表结构
.ibd 表数据和索引
MyISAM
.frm 表结构
.MYD 表数据
.MYII 索引
BlackHole
.frm 表结构
Memory
.frm 表结构
MySQL基本数据类型:
整型
tinyint smallint int bigint
1.不同类型能存储的数字范围不一样
2.验证是否自带符号
create table t5(id tinyint);
insert into t5 values(-129),(256);
结论:所有的整型都是自带符号的
create teble t6(id tinyint unsigned);
针对整型字段 括号里面的数字不是用来限制存储长度而是用来控制展示长度
定义整形字段无需自己写括号和数字。
验证
create table t12(id int(4) zerofill);
insert into t12 values(1),(111111);
浮点型
float(255,30)
总共255位,小数占30位
double(255,30)
总共255位,小数占30位
decimal(65,30)
总共63位,小数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();
insert into t8 values();
insert into t9 values();
精确度不一样
float < double < decimal
在实际开发过程中 很多时候看似需要用数字存储的数据,其实我们可以用字符串存储。
字符类型
char(4)
最大存储4个字符,超出直接报错,不超出空格填充至4位。
varchar(4)
最大存储4个字符,超出直接报错,不超出有几位存几位。
create table t10(id int,name char(4));
create table t11(id int,name varchar(4));
insert into t10 values(1,‘jason’)
insert into t11 values(1,‘jason’)
5.6通过设置严格模式,通过设置配置修改sql_mode,自定义设置时可能忘记设置。
查看sql_mode
show variables like ‘%mode%’;
修改
set global sql_mode = ‘strict_trans_tables’;
推出客户端重启
统计字段长度
selcet char_length(name) from t10
设置严格模式查看空格,验证是否自动填充。
set global sql_mode = ‘strict_trans_tables,pad_chat_to_full_length’;
char
优点:整存整取,速度快。
缺点:浪费硬盘空间
varchar 加bytes包头记录数据长度
优点:节省硬盘空间
缺点:速度没有char快。
日期类型
datatime 年月日 时分秒
time 时分秒
date 年月日
year 年
create table t13(
id int,
name varchar(32),
reg_time datetime,
study_time time,
birth date,
r_time year
);
枚举与集合类型
枚举 多选一
create t14 (
id int,
name char(16),
gender enum(‘male’,‘female’,‘other’)
)
集合 多选多(多选一)
create t14 (
id int,
name char(16),
hobby set(‘read’,‘study’,‘music’,‘tea’)
)
补充思想:
乐观锁悲观锁
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。一般的实现乐观锁的方式就是记录数据版本。乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。
公钥私钥
公钥用来加密,私钥用来解密。
冷数据与热数据
访问频次层面
热数据:是需要被计算节点频繁访问的在线类数据。
冷数据:是对于离线类不经常访问的数据,比如企业备份数据、业务与操作日志数据、话单与统计数据。
数据分析层面
独有的数据技术引擎:冷数据、温数据和热数据。
冷数据——性别、兴趣、常住地、职业、年龄等数据画像,表征“这是什么样的人”;
温数据——近期活跃应用、近期去过的地方等具有一定时效性的行为数据,表征“最近对什么感兴趣”;
热数据——当前地点、打开的应用等场景化明显的、稍纵即逝的营销机会,表征“正在哪里干什么”。
创建表的完整语法:
create table 表名(
字段名1 字段类型(宽度) 约束条件,
字段名2 字段类型(宽度) 约束条件,
字段名3 字段类型(宽度) 约束条件
);
1.字段名与字段类型是必须的,宽度和约束条件是可选的。
2.约束条件可以有多个。
字段名 字段类型(宽度) 约束条件1 约束条件2 约束条件3;
3.最后不需要加,
约束条件:
在字段类型的基础上添加额外的约束
zerofill 填充
unsigned 无符号类型
not null 非空
default 默认
unique 唯一
porimary key 主键
auto_increment 自增
foreign key 外键
1.unsigined 无符号
2.zerofill 填充
3.not null 非空
create table t2(
id int,
name varchat(32) not null
);
4.default 默认值
create table t3(
id int,
name char(32),
gender enum(‘male’,‘female’,‘others’) default ‘male’
);
5.unique 唯一
单列唯一
create table t4(
id int,
name varchar(32) unique
);
多列唯一
create table t5(
id int,
host varchar(32),
port int,
unique(host,port)
);
6.primary key 主键
1.单从限制上来看,主键相当于是非空且唯一的约束。
create table t6(
id int primary key
);
2.InnoDB存储引擎规定了在创建表的时候必须有且只有一个主键。
①为什么之前创建表的没有主键也可以?
当表中没有任何的约束条件字段,为了能够顺利地创建出表,InnoDB存储引擎会采用内部隐藏的字段作为主键。
隐藏意味着我们无法使用到,主键可以帮助我们加快数据的查询速度。
②没有主键但是存有非空且唯一的字段,那么会自动将该字段升级为主键
create table t7(
id int,
age int not unll unique,
pwd int not null unique
);
结论:我们在创建表的时候一般都会创建一个id字段(序号\编号),并且我们会将该字段设置为主键。
联合主键
create table t8(
id int,
nid int,
primary key(id,nid)
);
7.auto_increment 自增
专门用来给key键使用的 -> primary key
主键的固定写法:
create table t8(
id int primary key auto_increment
);
InnoDB引擎自增是有限制的
there can be only one auto column and it must be defined as a keym
主键的特征:
delete from 不影响主键的自增。
truncate 清空表数据并且充值逐渐。
添加数据的两种方式:
insert into t1 values(); #按字段顺序一一传值。
insert into t1(name) values(); #指名道姓的传值。
外键 foreign key(dep_id) references dep(id)
问题:
1.表结构不明确(忽略)
到底是员工表还是部门表。
2.浪费存储空间(忽略)
硬盘不花我的钱。
3.表扩展性不足(不能忽略)
拆分:
上述三个问题都可以解决,但员工与部门之间的联系消失。
外键字段
用来建立表与表之间的关系的字段。