1、数据库四大范式?
第一范式:属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式:满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式:满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)
BCNF(BC范式) 它构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键 (其他非主键字段),那么称R为BCNF的模式
。
- 1NF: 字段是最小的的单元不可再分
- 2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键 (一般我们都会做到)
- 3NF:满足2NF,非主键外的所有字段必须互不依赖
4NF:满足3NF,消除表中的多值依赖
PS:
满足BCNF的关系模式,肯定也满足3NF;同理,满足3NF的关系模式,肯定也满足2NF
2、SQL生命周期?
- 应用服务器与数据库服务器建立一个连接
- 数据库进程拿到SQL请求
- 解析并生成执行计划执行
- 读取数据到内存并进行逻辑处理
- 通过步骤一的连接,发送结果到客户端
- 关闭连接,释放资源。
3、SQL六种语言?
3.1.数据库定义语言 DDL (Data Definition Language)
面向的对象: 数据库 和 表(逻辑结构、表结构、视图、索引)
关键字: create、alter、drop、truncate
(删除当前表再新建一个相同的表)
3.2. 数据库查询语言 DQL (Data Query Language)
面向的对象: 表、字段
语句顺序:select (distinct)...from...join...on...where...group by...having...order by...limit
执行顺序:from...on...join...where...group by...having...select(distinct)...order by...limit
where和having的区别:
1.WHERE子句用来筛选 FROM 子句中指定的操作所产生的行,在执行分组之前进行应用;GROUP BY子句用来分组 WHERE 子句的输出;HAVING子句用来从分组的结果中筛选行,在执行分组之后进行应用。
2.where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。
3.where可以用于select、update、delete和insert语句中;having只能用于select语句中
。
3.3. 数据库操纵语言 DML (Data Manipulation Language)
面向的对象: 记录(行)
关键字: insert、update、delete
注意:
开发中很少使用delete,删除有物理删除
和逻辑删除
,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;若值为0,代表没有删除。
此时,对数据的删除操作就变成了update操作了。
truncate和delete的区别:
truncate
是删除表,再重新创建这个表。属于DDL
,delete
是一条一条删除表中的数据,属于DML。
3.4. 数据库控制功能 DCL (Data Control Language)
面向的对象: 用户、权限、事务。
关键字: grant,revoke
3.5、事务处理语言 DPL
事务处理语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION、COMMIT和ROLLBACK。
3.6、指针控制语言 CCL
它的语句,像DECLARE CURSOR、FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
4、索引?
4.1什么是索引?
- 官方介绍索引是帮助MySQL高效获取数据 的数据结构 。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
- 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。
- 我们通常所说的索引,包括
聚集索引、覆盖索引、组合索引、前缀索引、唯一索引
等,没有特别说明,默认都是使用B+树结构
组织(多路搜索树,并不一定是二叉
的)的索引。**
4.2索引类型?
-
主键索引
索引列中的值必须是唯一的,`不允许有空值`。
-
普通索引
MySQL中基本索引类型,没有什么限制,`允许`在定义索引的列中`插入重复值和空值。`
-
全文索引
只能在文本类型CHAR,VARCHAR, TEXT 类型字段上创建全文索引。字段长度比较大时,如果创建普通索引, 在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
-
唯一索引
索引列中的值必须是`唯一`的,但是`允许为空值`。
-
空间索引
MySQL在5.7之后的版本支持了空间索引,而且支持`OpenGIS`几何数据模型。 MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
-
前缀索引
在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
-
其他(按照索引列数量分类)
1. 单列索引
2. 组合索引: 组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则) 。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。
4.3索引的优势和劣势?
4.3.1优势
- 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
- 通过索引列对数据进行排序 ,降低数据排序的成本,降低了CPU的消耗。
被索引的列会自动进行排序
,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多
。
4.3.2劣势
- 索引会占据磁盘空间
- 索引虽然会提高查询效率,但是会降低更新表的效率
- 比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
5、最左匹配原则?
过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法使用。
(>、<、between、like)都会停止匹配。
ps:创建的索引列都存在,Mysql的优化器
会自动给你排序。
6、哪些情况不要创建索引?
-
表记录太少
300w数据时MySQL性能就开始下降了,这时就可以开始优化了。
-
经常增删改的表
提高了查询速度,同时却会降低更新表速度,如对标进行INSRERT、UPDATE、DELETE 因为更新表时,MySQL不仅要保存数据还要保存一下索引文件
-
where条件里用不到的字段不创建索引
7、为什么索引后查询效率高呢?
这个就涉及到索引
和数据结构
了,类比书籍的目录页,索引通过B+树
的结构存放数据,横向数据多,纵向的高低越低,和磁盘
交互就越少,查询得速度就越快。
8、MySQL有关权限表都有哪些?
- user:用户账号、全局权限
- db:库级别权限
- host:废弃
- tables_priv:表级别权限
- colums_priv:列级别权限
- procs_priv:存储过程和存储函数相关的权限
- proxies_priv:代理用户权限
9、事务的ACID?
-
原子性(Atomicity):
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 -
一致性(Consistency):
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
-
隔离性(Isolation):
一个事务的执行不能对其它事务形成干扰。 即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 -
持续性(Durability):
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。 接下来的其它操作或故障不应该对其执行结果有任何影响。
10、索引的数据结构?
- Hash表
- 二叉查找树
- 平衡二叉树
- B树:改造二叉树
- B+树:改造B树
你知道的越多,你不知道的就越多