目录
SQL分类--语法整理(DDL | DML | DQL | DCL | TCL)
数据类型
float和double的区别
float是4个字节单精度的,double是8字节双精度的,精度更高,但都不是绝对的
char和varchar的区别
char:(0~255)以空间换时间 char(32) “张飞” 占32字符,定长字符串
varchar:(0~65535)以时间换空间 varchar(32)“张飞” 占2字符,变长字符串,按实际存储的来分配实际需要的空间,性能没有char好但更节约空间(不要超过5000)
括号里存储的是什么? MySQL5.0之前是字节,之后改为了字符,假设字符集是 UTF-8,一个中文占3个字节,char(32)只能存10个中文字符
用什么类型存储金额?
数据库中严禁用float和double来存金额
1.用定点数类型decimal
2.用长整型存储到金额的最小单位
超长文本怎么存储?(超过5000)
严禁使用varchar存储超长文本,应该改用Blob类型或者Text类型来存储,并且应该把超长文本的字段从当前表中拆分出去,独立用一张表去存储,然后和主表设置主外键关联,防止影响主表查询效率。
二进制文件(图片,音频,视频)怎么存储?
Binary类型可以存二进制数据,但是性能很差。
应该把二进制数据存储在文件里,然后在数据库里记录文件的路径
MySQL的整型支持无符号,使用关键字UNSIGNED
age tinyint --age字段取值范围是-128到127
age tinyint unsigned --age字段取值范围是0~255
约束
SQL分类--语法整理(DDL | DML | DQL | DCL | TCL)
连表查询的方式
关系类型和三范式、反三范式
数据库表关系:一对一、一对多(多对一)、多对多
三范式 - 以时间换空间(增加关系来减少冗余数据)
反(打破)三范式 - 以空间换时间 (允许适量的冗余数据,减少关系)
事务四大特性和四种隔离级别
锁的种类
死锁、如何防止死锁
索引
数据离散度越低越适合作索引(10%-15%)
索引有哪些优缺点?
优点:
索引可以大大提升查询的速度
缺点:
从时间上:在增删改的时候,为了保证索引的有序性,需要动态维护索引,牺牲了增删改的速度
从空间是:创建索引需要占用磁盘空间
索引的类型
4大类
主键索引:关键字 primary key (聚簇索引)
唯一索引:关键字 unique
普通索引:(非唯一) 关键字 index
全文索引:(关键字) fulltext
聚簇索引 = 主键索引 = 一级索引
非聚簇索引 = (唯一索引,普通索引) = 二级索引
创建和删除索引的语法
(聚簇索引=主键索引是表自带的,我们自己创建的都是非聚簇索引)
(如果表没有主键,会选择隐藏列rowid来创建聚簇索引)
创建:
1.在create table建表的时候添加索引
2.在create table建表成功以后,使用alter语句添加索引
ALTER TABLE 表名 ADD INDEX 索引名 (字段名);
3.在create table建表成功以后,使用create index语句添加索引
CREATE INDEX 索引名 ON 表名 (字段名);
删除:
1.使用alter语句删除索引
alter table 表名 drop KEY 索引名
2.使用drop语句删除索引
drop index 索引名 on 表名
索引的数据结构
MySQL的索引支持两种数据结构
1.B+Tree B+树结构索引 (默认使用)
2.Hash 哈希结构索引
数据结构的演进
二叉树:
问题:无法自平衡
平衡二叉树 - AVL树
左旋算法:当右边的叶子节点的深度-左边叶子节点的深度 > 1的时候,触发左旋
右旋算法:当左边的叶子节点的深度-右边叶子节点的深度 > 1的时候,触发右旋
目的:维持树的平衡
多路平衡二叉树 - B树
树的度数(Degree):每个节点中可以存储的元素的个数
单路数:度数=1
多路数:路数=n,n>1
同等规模的数据,单路树是高瘦树,多路树是矮胖树
多路树比单路树的优势在于 更少次数的磁盘IO就可以找到数据
MySQL是怎么设计索引的
树的每一个节点是一个磁盘块,MySQL将表的ibd文件拆分为很多个磁盘块
每个磁盘块的大小统一是16KB,每次磁盘IO都是读取一个磁盘块的数据
一个磁盘块的数据也称为一页数据
B-树升级为B+树