数据库三范式:
第一范式:表中所有字段都是不可再拆分的原子值
第二范式:在满足第一范式的条件下,所有非主属性都依赖于主键
第三范式:在满足第二范式的条件下,所有非主属性都对主键有直接关系
mysql架构
mysql分为应用层(连接处理、用户鉴权、安全管理)、服务层(SQL接口、解析器、查询优化器、Cache与buffer缓存)、数据库引擎层(常见的MyISAM,InnoDB等)、物理层(负责文件存储、日志等)
执行SQL语句的过程
1.客户端通过连接器进行身份认证、权限
2.执行查询语句时先查缓存,若有相同的就直接返回缓存数据(MYSQL8.0后取消这步骤)
3.没有命中缓存,SQL语句就经过解析器、分析语句,包括语法检查等
4.通过优化器,将SQL语句用MYSQL认为最优的方案进行
5.执行语句,从存储引擎返回数据
共享锁排他锁
共享锁也称读锁,多个用户可以同时读同一数据不阻塞;排他锁也称写锁,确保同一时间只有一个用户操作该数据
如何解决数据库死锁
1.预先检测到死锁的循环依赖,并立即返回错误
2.查询时间达到锁超时时间时,放弃锁请求
乐观锁悲观锁
对冲突保持的态度分为乐观和悲观
乐观锁在操作数据时不会对数据加锁,只有提交数据时才通过机制来验证数据是否冲突
悲观锁在修改数据前将数据锁住,直到释放锁后,下一个人对数据加锁才能进行下一次修改
一般数据库都是基于悲观锁
简述InnoDB存储引擎
是MySQL的默认事务型引擎,支持事务,适合数据频繁增删查改的情况
简述MyISAM存储引擎
MySQL5.0及之前使用的默认引擎,不支持事务不支持外键不支持行级锁,count运算快,支持表级锁,适合查询频繁,增删查改少的情况
简述Memory存储引擎
将所有数据保存在内存,不需要磁盘IO,支持哈希索引,查找速度极快,使用表级锁,并发写入的性能低
索引是什么
是存储引擎中用于快速找到记录的一种数据结构,在关系型数据库中,索引具体是一种对数据库中一列或多列的值进行排序的存储结构
为什么引入索引?
为了提高数据查询的效率。索引对数据库查询良好的性能非常关键,当表中数据量越来越大,索引对性能的影响越重要
MySQL常见索引类型
数据结构角度:B-Tree、哈希、R-Tree、全文
物理存储角度:
主键索引(聚簇索引),叶子节点存整行数据
非主键索引(二级索引),叶子节点存主键的值
简述B-Tree与B+树
B-Tree是一种自平衡的多叉树。每个节点都存储关键字值,其左子节点的关键字值小于该节点关键字值,且右子节点的关键字值等于大于该节点关键字值。
B+树也是一种自平衡的多叉树。基本定义与B树相同,不同点在于数据只出现在叶子节点,所有叶子节点增加一个链指针,方便进行范围查询。
B+树中间节点不存放数据,因此可以容纳更多节点,访问节点关联数据也有更高命中率,并且数据顺序排列相连,便于区间查找搜索。
B树每个节点包含Key和Value,查询效率比B+树高。
Hash索引
哈希索引基于哈希表实现,哈希索引将所有哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
只有Memory引擎显式支持哈希索引
Hash索引不支持范围查询,无法用于排序,也不支持部分索引列匹配查找,但是哈希查找速度非常快。
自适应Hash索引
InnoDB对于频繁使用的某些索引值,会在内存中基于B-Tree索引之上在建立一个哈希索引,这也被称为自适应Hash索引
稠密索引和稀疏索引
稠密索引:每个搜索键值都有一个索引记录,可以比稀疏索引更快地定位到某条记录
稀疏索引:只为某些码值建立索引记录,搜索时找到其最大的搜索码值小于或等于所查找码值的索引项,从该纪录向后顺序查找直至找到。