0X00 基础知识
四大范式
- 第一范式
所有属性都是原子性的,不可再分
- 第二范式
无关属性不能对码的部分有函数依赖
F = {
A ➜ D,
B ➜ C
}
参考:https://www.jianshu.com/p/8d596c5e98e0
- 第三范式
无关属性不能对码的部分有传递函数依赖
- BC 范式
主属性对于码的部分不能有函数依赖与传递函数依赖
MySQL 有关权限的表都有哪几个
- user 权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的
- db 权限表:记录各个帐号在各个数据库上的操作权限
- table_priv权限表:记录数据表级的操作权限
- columns_priv权限表:记录数据列级的操作权限
- host权限表:配合 db 权限表对给定主机上数据库级操作权限作更细致的控制
MySQL 的 binlog 有有几种录入格式?分别有什么区别?
binlog 其主要是用来记录对 mysql 数据更新或潜在发生更新的 SQL 语句,并以"事务"的形式保存在磁盘中,binlog 的主要目的是复制和恢复
- statement 格式,就是记录会修改数据库的 sql,不需要记录每一行的变化,减少了日志量。由于 sql 的执行是有上下文的,因此在保存的时候需要保存相关的信息
- row 格式,不记录 sql 语句上下文的相关信息,只记录哪条记录被修改
- mixed 格式,statement 与 row 的混用,普通情况下用 statement
简单的说,Statement 模式读写元数据,优点是:时间短复制快,缺点是:很多函数不支持;Row 模式读写数据本身,优点是:复制逻辑简单安全,缺点是:时间长复制慢。Mix 是混合模式,两者兼顾。不过无论是那种,都是数据增量复制。
0X01 索引
什么是索引
索引就是一种数据结构,用来加快对数据库的读和写。
比如用 B+Tree B-Tree Hash 这三种数据结构做索引
B+Tree 和 B-Tree
- B+Tree 有那些特点
- 每个节点上可以存储多个节点,树的高度小,IO 的次数低
- 非叶子节点存储只存储索引,叶子节点存储索引和数据
- 叶子节点之间有指针相连,区间查询效率高
- B-Tree 有哪些特点
- 出现任何关键字,并且仅出现在一个节点中
- 搜索可以在非叶子节点处结束
- 有哪些不同
- B+Tree 由于非叶子节点不存储数据,所以速度铁定 logn。B-Tree 最好可以到 O(1)
- B+Tree 叶节点成对连接,范围查询十分方便
索引的优缺点
- 优点
- 通过创建唯一索引,可以保证数据中每一行数据的唯一性
- 可以大大加快数据的检索速度
- 可以加速表与表之间的的连接
- 可以加速分组和排序的速度
- 缺点
- 创建索引和维护索引需要时间,而且随着数据量的增多而增加
- 索引需要占物理空间
- 对数据进行操控时,也需要维护索引,降低维护速度
什么时候使用索引
- 经常搜索的列(包括分组、排序 where)
- 在经常用在连接上的列使用索引
什么时候不应该使用索引
- 不经常搜索的列
- 值域很少的列
- 对 text, image 和 bit 数据类型不应该加索引,这些值都很特殊,有的特别大,而且没有什么连续性
索引的设计原则
- 索引并非越多越好,大量的索引占空间,而且影响更新数据库的速度
- 避免对经常更新的表做更多的索引
- 在频繁进行排序和分组的列上建立索引,如果排序的列有多个,可以在列上建立联合索引
- 值域少的列,不要建立索引
百万级别或以上的数据如何删除
- 先删除索引
- 删除数据
- 重新建立索引
什么是「最左前缀原则」
这个最左前缀原则是对一个表中的联合索引说的,任何一个索引的最左前缀,都可以被用于查找。比如你创建了一个 (col1, col2, col3) 的索引那么这个缩影会生效于:(col1)(col1, col2)(col1, col1, col3) 的查找。如果查询的列不是索引的最左前缀, 那MySQL不会将索引用于执行查询.
B-Tree 的好处
- 先回答什么是 B-Tree
B 树是多路平衡查找树,在相同节点树上,它的高度跟平衡二叉树比会小很多。而且它的树节点上存储了数据和儿子节点的指针
- 为什么 IO 少
B 树将键相近的数据存储在同一个节点,当访问其中某个数据时,数据库会将该整个节点读到缓存中。当它临近的数据紧接着被访问时,可以直接在缓存中读取,无需进行磁盘IO;换句话说,B树的缓存命中率更高。
B+Tree 的好处
- B+Tree 与 B-Tree 有什么不同
最大的不同就是:B 树可以在非叶结点中存储数据,但是 B+ 树的所有数据其实都存储在叶子节点中。而且所有的叶子节点通过双向链表连接
- 为什么使用 Mysql 使用 B+ 树,而不用 B 树
B 树能够在非叶节点中存储数据,但是这也导致在查询连续数据时可能会带来更多的随机 I/O,而 B+ 树的所有叶节点可以通过指针相互连接,能够减少顺序遍历时产生的额外随机 I/O;
- 为什么 MongoDB 使用 B 树,而不用 B+ 树
我觉的主要原因是 MongoDB 不是关系型数据库,认为查询单个数据的更重要,由于 B 树在非叶子节点上存储了数据,所以会比 B+ Tree 要快
什么是覆盖索引
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取
什么是聚簇索引以及非聚簇索引
当叶子节点中存储的是当前的 key 值以及整行的数据就是「聚簇索引」
叶子节点中存储是这条数据在当前的 key 和「聚簇索引」的key就是 「非聚簇索引」
也就是我们说的建立辅助索引要回表查询。
但是也不一定需要回表查询,因为:只要「非聚簇索引」的索引有我们需要的信息就够了,比如:
假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20
的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.
联合索引是什么?为什么需要注意联合索引中的顺序?
MySQL 可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
网友评论