- 数据库的三大范式
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。(表的行数据要依赖于主键)
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。(行数据之间不存在a->b->c的依赖关系)
-
数据库事务的四大特性(ACID)
a.原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
b.一致性:是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
c.隔离性:当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
1)未提交读:最低级别,任何情况都无法保证。
2)已提交读:可避免脏读的发生。
3)可重复读:可避免脏读、不可重复读的发生。
4)串行化:可避免脏读、不可重复读、幻读的发生。
d.持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 -
数据存储结构
mysql采用的是B+Tree的数据结构,那么跟B-Tree有什么区别吗?为什么要采用B+Tree的数据结构?
a.区别
1)B-Tree是非叶子节点和叶子节点都能存放键值和数据的,但是B+Tree是只有叶子节点才存放数据,非叶子节点只存放键值;
2)B-Tree的叶子节点在同一层,并且升序排列;B+Tree叶子节点是一个双向环形链表
b.为什么采用B+Tree?
因为B-Tree有个最大的问题是不能很好的范围查询,而B+Tree叶子节点上有下一个记录的指针,所以范围查询是非常方便的;另外相比于红黑树(一种二叉平衡树,一个节点,只有一个数据和两个子节点的地址;根节点、叶子节点必须是黑色;红色节点必须有两个黑色的叶子节点;所有路径上都有相同数目的黑色节点)而言,树高增长慢,不浪费每次读取。 -
索引类型
a)按索引的存储方式划分
FULLTEXT--MYISAM
HASH
BTREE-将索引值按一定的算法,存入一个树形的数据结构中
RTREE-MySQL很少使用
b)按索引类型划分
唯一索引
主键索引
全文索引
组合索引 -
聚簇索引和非聚簇索引
聚簇索引是innodb里的主键索引,将索引的键值和数据都存放在叶子节点上,一个表只能有一个聚簇索引。
非聚簇索引对于innodb而言是只存放该索引的键值和主键;对于myisam而言,叶子节点存放数据为索引键值和对应数据的指针 - mysql的执行计划怎么看?应该关注哪些数据?
语法:explain+sql语句a. id:表示查询子句的查询顺序,值越大优先级越高,id相同为同一组。
b. select_type: SIMPLE(查询中不包含子查询);
若包含子查询,外部的查询标记为PRIMARY
SUBQUERY(SELECT或者where条件包含子查询);
DERIVED(FROM中有子查询)
UNION(查询中有UNION),如果FROM中有UNION的子查询,则外层的被标注为DERIVED,从union获取结果被标记为UNION RESULT
c.table:操作的表名
d.type:ALL(全表扫描)
index(遍历索引树)
range(索引范围查找)
ref(非唯一索引扫描)
eq_ref(唯一索引扫描)
const(where查询值转换为常量)
system(当表中只有一行数据的const查询)
NULL(不用访问表和索引)
e.possible_keys:可能用到的索引
f: key:实际使用的索引
g:key_len: 索引长度
h:ref:表的连接条件
i:rows:查询行数
j:Extra:其他信息
Using index:select中使用了索引
Using where:查出记录后存储引擎再过滤
Using temporary: 为了排序和分组,采用临时表存储结果
Using filesort:无法使用索引