MySQL数据库面试题总结(2)

今天内容

国庆节就这么过完了,是不是应该开始迎接双十一了,哈哈哈哈哈哈开个玩笑啦~
言归正传啊,这几天总结后发现,其实数据库里面的内容其实也不少诶,咱们这两节还只是总结了MySQL这一种关系型数据库,后面可能还需要学一些非关系型数据库就比如:Redis、MongoDB之类的,,所以真的,学无止境!你可能今天学的是这个东西,但是过几天后又会有新的技术点去代替这个东西,没办法啦,做好当下就好!加油!

面试问题总结

  1. 数据库的三范式
    1. 第一范式:保证每列的原子性,每列都要是不可分割的最小数据单元
    2. 第二范式:表中的非主键列不存在对主键的部分依赖
    3. 第三范式:表中的列不存在对非主键列的传递依赖

  1. select count(*)和select count(1)的区别
    1. 一般返回结构是一样的
    2. 如果没有主键,那么count(1)会比count(*)要快
    3. 如果有主键,那么count(主键)最快
    4. 如果你的表中只有一个字段,那么就是count(1)更快

  1. char和varchar的区别
    1. char:固定长度,效率高,通常用来存放md5值
    2. varchar:可变长度,占用空间较少!

  1. 数据库锁有哪些?
    1. MySQL各引擎使用了三张类型级别的锁机制:表级锁定、行级索引、页级锁定
    2. 表级锁:一次可以锁定整张表。主要是在MylSAM、Memory等非事务存储引擎,是适用于查找为主,更新少的应用
    3. 行级锁:容易发生死锁,主要是Innodb、NDBCluster分布式引擎。适用于对事务完整性要求较高的系统,是针对索引加的锁,Innodb的行级锁类型有:
      1. 共享锁(读锁):多个事务对同一数据共享一把锁,都能访问到数据,只读!
      2. 排它锁(写锁):可以select进行查询,普通查询没有任何锁机制!
      3. 意向锁(Innodb自动加的锁):提高效率
    4. 页级锁:介于行级锁和表级锁之间,会发生死锁!

  1. 数据库引擎和区别
    1. Mylsam:MySQL的默认引擎(5.1版本之前),但是不提供事务的支持!也不支持行锁和外键,所以当插入更新时要锁定整个表,效率会低很多
    2. InnoDB:底层存储接口为B+树,B树的每个节点对应的innodb的一个Page(一般设置为16),使用场景有:经常更新的表,使用处理多重并发的更新请求,支持事务、外键约束、自动增长属性。支持行级锁和表级锁,默认用到的是行级锁!
    3. Memory:也是Heap(堆内存),使用存在内存中的内容来创建表,访问速度非常快,因为数据是放在内存中,默认使用的是hash索引,但是一旦服务关闭,表中的数据就会丢失!支持B树索引和散列索引~
    4. Archive
    5. Federated

  1. Innodb是如何保证原子性的
    1. redolog称为重做日志,用来保证事务的原子性和持久性
    2. undolog称为回滚日志,用来保证事务的一致性

  1. Innodb的锁机制
    1. 通过索引条件查询数据,innodb才会使用行级锁,否则就会用到表级锁
    2. 提交事务或者回滚事务就会释放锁

  1. MySQL的二级缓存
    1. 一级缓存:Mybatis在默认情况下是对支持缓存的,而且只是开启一级缓存,而一级缓存是针对于一个SqlSession而言的。所以在参数和SQL都一样的情况下,我们如果第一次使用SqlSession.getMapper()方法时,Mybatis会将其放入到缓存中,以后再查询的时候,如果声明没有变化时,SqlSession就会取出当前的缓存数据,而不会再次发送SQL到数据库。
    2. 二级缓存:Application级别的缓存,可以提高对数据库查询的效率,以提高应用的性能。如果一个会话查询一条数据,那么当前数据就会放在当前会话的一级缓存中,如果当前会话关闭了,那么一级缓存中的数据就会被保存到二级缓存!而二级缓存的开启需要自行配置,需要在Mybatis.xml中配置cacheEnabled的value为true!

  1. 分库分表是如何做的?
    1. 垂直分表:按照功能模块切分、关系密切程度进行划分,然后部署到不同的数据库上。
    2. 水平切分:如果表中的数据量较大时,可以按照某种规则进行划分,如UserId的散列(取余值)

  1. limit后面写0会发生什么情况?
    1. 如果limit后面写的是0,会查出0条数据,不会报错!
    2. 一般会用在数据量比较少的时候或者没有偏移量需求的地方

  1. 数据库的性能优化
    1. 为搜索字段创建索引
    2. 避免使用select *,列出需要查询的字段
    3. 垂直分割分表
    4. 选择正确的存储引擎

  1. 验证MySQL的索引满足需求的方法
    1. 可以使用explain来查看SQL是如何执行查询语句的,从而分析你的索引是否满足需求
    2. 语法:explain select * from table where type = 1

  1. sql的优化
    1. 对查询进行优化,应该尽量避免全表扫描,应该首先考虑在where或者order by涉及的列上面建立索引!
    2. 避免在字段上进行计算操作
    3. 避免频繁的创建删除数据表
    4. 将大的增删操作进行拆分,可以提高并发的性能!

  1. MVCC的理解
    1. MVCC(Multi-Version Concurrency Control)多版本并发控制,是一种并发控制的方法,一般是在数据库管理系统中实现并发访问,在编程语句中实现事务内存,在MySQL中主要是为了提高数据库并发的性能,可以用更好的方式去处理读写冲突。
    2. 优势:
      1. 可以解决脏读、幻读、不可重复读的事务隔离问题
      2. 同时也可以在并发读写数据库时,做到非阻塞读写操作,从而提高数据库并发读写的性能
    3. 综上所述MVCC也就是在原本数据库用悲观锁解决读写冲突至上的改进和升级,现在数据库中大多都是用MVCC和乐观锁或者悲观锁进行组合,这样能够更好的提高数据库并发读写性能。

  1. MySQL问题排查都有哪些方法?
    1. 使用show processlist命令来看当前所有连接信息
    2. 使用explain命令查询Sql语句执行计划
    3. 开启慢查询日志,查看慢查询的Sql

  1. 对数据库的慢查询的了解
    1. MySQL的慢查询是一种日志记录,用于记录超过响应时间阈值的语句,如果运行超过long_query_time(默认值为10),这条记录就会被记录到慢查询日志中!
    2. 默认情况下,Mysql数据库并不启动慢查询日志,就需要手动来设置该参数slow_query_log为1
    3. 一般是不会使用该参数的,当然如果需要做数据库调优就可以使用了!

  1. 雪花算法
    1. 雪花算法(SnowFlake)也就是分布式id的生成算法,核心思想就是:使用一个64bit的long型数字作为全局唯一id。在分布式系统中的使用十分广泛,而且id引入了时间戳,可以保证基础的自增!(其中的64个bit中,1个bit是不会用的,41个bit会作为毫秒数,10个bit作为工作机器的id,12个bit作为序列号~)
    2. 优点:生成时不用依赖数据库,完全在内存中生成;容量大,每秒能生成百万的自增id;存入数据库中,索引效率较高 ,因为id自增!
    3. 缺点:系统时间如果改变或者回调,就可能造成id冲突!

  1. AQS
    1. AQS(AbstractQueuedSynchronizer)是在Java.util.concurrent.Locks包下面,是一个用来构建锁和同步器的框架。
    2. 核心思想:如果请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设定为锁定状态,如果没请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时所分配的机制,该机制AQS是CLH队列锁实现的,即暂时获取不到锁的线程加入到队列中。

  1. CAP
    1. C(Consistency)一致性:所有的备份数据在同一时刻被访问时的值一致
    2. A(Availability)可用性:在集群中一部分单点故障后,集群整体还能响应客户端的读写请求(数据的高可用)
    3. P (Partition tolerance)分区容错性:如果不能在时限内达成数据一致性,那么就意味着发生了分区,那么就必须在CA中作出选择!
    4. CAP定理是指在分布式系统中,一致性、可用性、分区容错性不可兼得!

阶段性总结

通过这两节面试总结我们也可以看出来MySQL数据库这一部分的内容其实还是很多的,可以说是又多又杂,本人在做总结的时候很多地方其实了解的也还是比较浅的,如果里面有你感兴趣的,大家可以自行去找一些较深入的文章去了解了解~
过了这一部分,下一节咱就开始总结关于JavaWeb部分了,再往后面就要开始准备进框架了,所以大家学习的时候也一定要开始重视JavaWeb部分的内容,因为知识点都是有关联的,可能你现在看视频觉得soeasy啦,就开倍数看对吧,但是到后面学框架的时候你又懵了,还得回来看,可是可以,但是没必要对吧,所以一步一个脚印,不要跳着学,否则很有可能就从入门到放弃了!!!
最近事情好多啊,太忙了,所以咱下节再见啦~

MySQL数据库面试题总结(2)_第1张图片

你可能感兴趣的:(mysql,数据库,sql,面试)