今天咱们用10分钟,重点梳理一遍如下几方面:mysql
1、数据库的不一样类型面试
1.经常使用的关系型数据库sql
2.NoSQL数据库(非关系型数据库)数据库
3.NewSQL数据库(新一代关系型数据库)缓存
2、事物特性及事物类型服务器
后面的详解知识点会展开介绍数据结构
3、数据库的范式并发
前关系数据库有六种范式:第一范式、第二范式、第三范式、巴斯-科德范式(BCNF)、第四范式和第五范式。范式级别越高对数据表的要求越严格。框架
详解知识点一:数据库事务数据库设计
知识点
▌1.数据库事务特性
数据库的特性是面试时考察频率很是高的题目,共4个特性:
▌2.事物并发问题与隔离级别
a.事务并发问题
b:事务的四种隔离级别
能够用于解决这几种并发问题。如图右面,由上到下的4种隔离级别由低到高。
▌3.事务分类
共分5大类:
其中,经常使用的分布式事务解决方案共4种
a.XA协议:是保证强一致性的刚性事务。实现方式有两段式提交和三段式提交。两段式提交须要有一个事务协调者来保证全部的事务参与者都完成了第一阶段的准备工做。若是协调者收到全部参与者都准备好的消息,就会通知全部的事务执行第二阶段提交。通常场景下两段式提交已经可以很好得解决分布式事务了,然而两阶段在即便只有一个进程发生故障时,也会致使整个系统存在较长时间的阻塞。三段式提交经过增长Pre-commit阶段来减小前面提到的系统阻塞的时间。三段式提交不多在实际中使用,简单了解就能够了。
b.TCC:是知足最终一致性的柔性事务方案。TCC采用补偿机制,核心思想是对每一个操做,都要注册对应的确认和补偿操做。它分为三个阶段:Try阶段主要对业务系统进行检测及资源预留;Confirm阶段对业务系统作确认提交。Cancel阶段是在业务执行错误,执行回滚,释放预留的资源。
c.消息事务:第三种方案是消息一致性方案。基本思路是将本地操做和发送消息放在一个事务中,保证本地操做和消息发送要么都成功要么都失败。下游应用订阅消息,收到消息后执行对应操做。
d.GTS/Fescar:阿里云中的全局事务服务GTS,对应的开源版本是Fescar。Fescar基于两段式提交进行改良,剥离了分布式事务方案对数据库在协议支持上的要求。使用Fescar的前提是分支事务中涉及的资源,必须是支持ACID事务的关系型数据库。分支的提交和回滚机制,都依赖于本地事务来保障。 Fescar的实现目前还存在一些局限,好比事务隔离级别最高支持到读已提交级别。
详解知识点二:MySQL数据库
▌1.经常使用SQL语句
须要能手写经常使用SQL语句,这里没有什么特殊的技巧,根据如图列出的语句类型多作一些练习
▌2.数据类型
要知道MySQL都提供哪些基本都数据类型,不一样数据类型占用的空间大小。
▌3.MySQL中主要的存储引擎
MyISAM是MySQL官方提供的存储引擎,其特色是支持全文索引,查询效率比较高,缺点是不支持事务、使用表级锁。InnoDB在5.5版本后成为了Mysql的默认存储引擎,特色是支持ACID事务、支持外键、支持行级锁提升了并发效率。TokuDB是第三方开发的开源存储引擎,有很是快的写速度,支持数据的压缩存储、能够在线添加索引而不影响读写操做。可是由于压缩的缘由,TokuDB很是适合访问频率不高的数据或历史数据归档,不适合大量读取的场景。
▌4.MySQL中的锁
MyIASAM使用表级锁,InnoDB使用行级锁。表锁开销小,加锁快,不会出现死锁;可是锁的粒度大,发生锁冲突的几率高,并发访问效率比较低。行级锁开销大,加锁慢,有可能会出现死锁,不过由于锁定粒度最小,发生锁冲突的几率低,并发访问效率比较高。
注:
▌5.索引
后文重点讲解
▌6.MySQL的存储过程与函数
存储过程和函数均可以免开发人员重复编写相同的SQL语句,而且存储过程和函数都是在MySQL服务器中执行的,能够减小客户端和服务器端的数据传输。
存储过程可以实现更复杂的功能,而函数通常用来实现针对性比较强的功能,例如特殊策略求和等。存储过程能够执行包括修改表等一系列数据库操做,而用户定义函数不能用于执行修改全局数据库状态的操做。
存储过程通常是做为一个独立的部分来执行,而函数能够做为查询语句的一个部分来调用。SQL语句中不能使用存储过程,但可使用函数。
不过存储过程通常与数据库实现绑定,使用存储过程会下降程序的可移植性,应谨慎使用。
▌7.新特性
能够了解MySQL8.0的一些新特性,例如默认字符集格式改成了UTF8;增长了隐藏索引的功能,隐藏后的索引不会被查询优化器使用,可使用这个特性用于性能调试;支持了通用表表达式,使复杂查询中的嵌入表语句更加清晰;新增了窗口函数的概念,它能够用来实现新的查询方式。窗口函数与 SUM、COUNT等集合函数相似,但不会将多行查询结果合并,而是将结果放在多行中。即窗口函数不须要GROUP BY。
▌8.MySQL调优
后文重点讲解。
➔重点讲解一:MySQL索引
索引能够大幅增长数据库的查询的性能,在实际业务场景中,或多或少都会使用到。
可是索引是有以下2个代价的:
a.须要额外的磁盘空间来保存索引
b.对于插入、更新、删除等操做因为更新索引会增长额外的开销
所以索引比较适合用在读多写少的场景。
▌1.MySQL索引类型
如左面的模块,共分为5类:
▌2.索引实现
如右面的模块,索引实现共分4种形式:
➔重点讲解二:MySQL调优
MySQL的调优也是研发人员须要掌握的一项技能
通常MySQL调优有图中的4个纬度:
这四个纬度从优化的成本角度来说,从左到右优化成本逐渐升高;从优化效果角度来看,从右到左优化的效果更高。
对于研发人员来讲,前两个纬度与业务息息相关,所以须要重点掌握,后两个纬度更适合DBA进行深刻学习,简单了解就好。
本文将重点关注前两个纬度
▌1.表结构和索引的优化
如左面的模块,应该掌握以下6个原则:
第1个原则:要在设计表结构时,考虑数据库的水平与垂直扩展能力,提早规划好将来1年的数据量、读写量的增加,规划好分库分表方案。好比设计用户信息表,预计1年后用户数据10亿条,写QPS约5000,读QPS30000,能够设计按UID纬度进行散列,分为4个库每一个库32张表,单表数据量控制在KW级别;
第2个原则:要为字段选择合适的数据类型,在保留扩展能力的前提下,优先选用较小的数据结构。例如保存年龄的字段,要使用TINYINT而不要使用INT;
第3个原则:能够将字段多的表分解成多个表,必要时增长中间表进行关联。假如一张表有四、50个字段显然不是一个好的设计;
第4个原则:是设计关系数据库时须要知足第三范式,但为了知足第三范式,咱们可能会拆分出多张表。而在进行查询时须要对多张表进行关联查询,有时为了提升查询效率,会下降范式的要求,在表中保存必定的冗余信息,也叫作反范式。但要注意反范式必定要适度;
第5个原则:要擅用索引,好比为常常做为查询条件的字段建立索引、建立联合索引时要根据最左原则考虑索引的复用能力,不要重复建立索引;要为保证数据不能重复的字段建立惟一索引等等。不过要注意索引对插入、更新等写操做是有代价的,不要滥用索引。好比像性别这样惟一不好的字段就不适合创建索引;
第6个原则:列字段尽可能设置为Not Null,MySQL难以对使用Null的列进行查询优化,容许Null会使索引、索引统计和值更加复杂。容许Null值的列须要更多的存储空间,还须要MySQL内部进行特殊处理。
▌2.SQL语句进行优化的原则
如右面的模块,共分5个原则:
第1个原则:要找的最须要优化的SQL语句。要么是使用最频繁的语句,要么是优化后提升最明显的语句,能够经过查询MySQL的慢查询日志来发现须要进行优化的SQL语句;
第2个原则:要学会利用MySQL提供的分析工具。例如使用Explain来分析语句的执行计划,看看是否使用了索引,使用了哪一个索引,扫描了多少记录,是否使用文件排序等等。或者利用Profile命令来分析某个语句执行过程当中各个分步的耗时;
第3个原则:要注意使用查询语句是要避免使用Select *,而是应该指定具体须要获取的字段。缘由一是能够避免查询出不须要使用的字段,二是能够避免查询列字段的元信息;
第4个原则:是尽可能使用Prepared Statements,一个是性能更好,另外一个是能够防止SQL注入;
第5个原则:是尽可能使用索引扫描来进行排序,也就是尽可能在有索引的字段上进行排序操做。
以上为数据库操做须掌握的内容,能够进行差缺补漏,但愿对研发人员有必定的帮助。
面试考察点
1.必须了解数据库的基本原理、使用场景以及经常使用队列、数据库的特色。MySQL提供了多种引擎能够支持事务型与非事务型的关系对象库服务等等。
2.要深入理解数据库事务的ACID特性,了解并发事务可能致使的并发问题和不一样的数据库隔离级别如何解决这些并发问题。
3.要掌握经常使用的MySQL语句,好比WHERE条件查询语句、JOIN关联语句、ORDER BY排序语句等等。还要熟悉经常使用的自带函数,例如SUM、COUNT等等。
4.要了解MySQL数据库不一样引擎的特色及不一样类型的索引实现。好比最长使用的InnoDB很是擅长事务处理,MyISAM比较适合非事务的简单查询场景。好比知道MySQL的惟一索引、联合索引、全文索引等不一样索引类型,以及最长使用等B+树索引实现等等。
面试加分项
1.要了解新特性,例如MySQL8.0中提供了窗口函数来支持新的查询方式;支持通用表表达式,使复杂查询中的嵌入表语句更加清晰等等。
2.要知道数据库表设计原则,若是有过线上业务数据库的设计经验就更好了,你可以知道如何对容量进行评估,也知道适当分库分表来保证将来服务的可扩展性,这会对面试起到积极的影响。
3.最好有过数据库调优经验,例如明明创建了索引的语句,可是查询效率仍是很慢,经过Explain分析发现表中有多个索引,MySQL的优化器选用了错误的索引,致使查询效率偏低,而后经过在SQL语句中使用Use Index来指定索引解决。