毕业季--数据库常见面试题

Posted 编程指南针

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业季--数据库常见面试题相关的知识,希望对你有一定的参考价值。

mysql的常见数据引擎(存储引擎)和区别

mysql中数据引擎有很多,我们常见的是myisam和innodb。要注意存储引擎和存储过程的区别。

  1. myisam是早期mysql默认的存储引擎。他会把表分成myd,myi,frm文件。而innodb是mysql5.5后默认的存储引擎,他把表里面的数据文件和索引文件进行了合并,存储到了聚簇索引里面。
  2. myisam不支持外键,表里面不能创建外键,innodb可以创建外键。
  3. myisam不支持事务,innodb支持事务。
  4. myisam只能支持表锁,innodb支持的锁比较多,行锁,间隙锁,表锁
  5. myisam应用在对速度和性能要求高的场景下面,不支持并发操作,innodb更注重于数据的完整性。

mysql的索引,聚集索引,回表,覆盖索引,索引下推,索引重排,最左匹配

mysql的数据存储在磁盘上面,为了便于数据的检索,mysql提供了一种快速查找数据的结构来方便我们查找数据。这个数据结构是以树状存储的。这个树状的存储结构即是索引。mysql的索引采用的是b+树。最好能说出b+树和平衡二叉查找树的区别,以及和b树的区别。
聚集索引:一个表里面只能有一个聚集索引。在聚集索引的叶子节点上要存储具体的行数据信息。一般情况下,mysql会为这个主键创建聚集索引。
非聚集索引:一个表里面可以有多个非聚集索引,针对一般字段创建的索引就是非聚集索引,非聚集索引树上存储了索引信息,然后在叶子节点上存储了该索引对应的id信息。
回表:当我们查询mysql表中的数据时,我们通过非聚集索引查到了该数据对应的id值后,又关联到聚集索引上去根据id查询改行数据,这个过程就是回表。
覆盖索引:当我们写的sql语句查询的字段刚好是索引的字段以及主键,那么我们就可以避免回表查,这个操作就叫覆盖索引。
最左匹配:当我们针对两列创建了一个组合索引,那么我们必须在查询的时候使用组合索引中最左边的列作为查询条件,该组合索引才能生效。否则这个组合索引是无效的。
索引下推:当我们根据两个以上的条件进行sql查询的时候,mysql会先根据一个条件进行查询,然后找到所有满足第一个条件的id值然后再回表查,查出数据后,在进行第二个条件的判断。这种没有使用到索引下推,他的问题是回表的次数可能很多。索引下推后,流程是,先根据非聚集索引查询满足两个条件的数据的id值,然后再根据id到聚集索引里面查询数据。这样回表的次数就会减少。
索引重排:由于改变了数据,导致索引树发生了重大的调整,从而影响到了修改的速度,这个就是索引重排,我们应该尽量的避免索引重排。我们使用mysql时应该尽量的使用自增主键,这样可以尽量的减少索引重排的几率,如果使用uuid这样的数据作为主键,就会导致索引重排的几率加大。

什么是数据库的事务,什么是脏读,不可重复读,幻读。

 

事务有四个特性:1.原子性,2.隔离性,3.一致性,4.持久性。原子性指的就是事务里面执行的增删改操作是一个原子操作,要么全部成功,要么全部失败。隔离性指的是两个事务之间同时操作数据库的时候有相应的隔离级别,可以限制事务与事务之间数据的影响。一致性指的是事务操作前和事务操作后数据必须是正确的。持久性指的是事务做完操作之后,数据就别永久保存了,不会因为一些原因导致数据丢失。事务的这些特性会保证我们项目中数据的安全,不会因为一些异常导致数据出问题。

事务的隔离级别有四个:1.未提交读,2.已提交读,3.可重复读,4.序列化。未提交读会引起脏读问题。脏读就是指一个事务插入数据后,还没有提交事务的情况下,其他的事务就可以读到该数据,这就是脏读问题。已提交读解决了脏读的问题,但是没有解决不可重复读的问题。不可重复读指的是一个事务读两次相同的数据,发现两次读到的数据是不一致的。因为中间有其他的事务修改这个数据。为了避免不可重复读的问题,我们可以把事务的隔离级别提高到可重复读的级别。可重复读解决了不可重复读的问题,但是有幻读的问题,幻读是指一个事务读到数据库里面没有一条数据,在他插入该数据的时候突然发现数据库里面已经有这个数据了。数据库提供了序列化读的隔离级别,可以解决幻读问题。隔离级别越高,那么数据库的性能就会越低。

如何提高mysql的sql执行效率

解决这个问题需要下面三个步骤:

  1. 找到执行效率低的sql语句。有两个手段,第一是通过慢查询日志。我们在mysql打开慢查询日志,这样执行慢的sql语句就会被记录到我们的日志文件中。第二是通过show processlist来实时观察mysql正在运行的sql语句。

  2. 分析sql语句运行效率低的原因.

    mysql中提供了执行计划命令可以帮助我们观察一个sql语句执行时候经历了什么样的操作。比如用没有索引,回表了没有,索引下推了没有,我们都可以通过这个执行计划观察到。查看执行计划的命令是explain sql命令就可以了。通过explain的查询结果我们可以分析该sql语句是否使用到了索引,是否使用索引下推这些功能,然后针对性的进行性能的优化。

  3. 优化sql。最左匹配原则,避免使用like,like有可能会导致索引失效。避免使用or。尽量使用覆盖索引。 模型数空运最快,模糊查询,查询类型不匹配,字段上的函数运算,查询is null或者is not null,在字段上面做运算,都要尽量避免。

以上是关于毕业季--数据库常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

毕业季--Java框架常见面试题

毕业季--Java框架常见面试题

java常见面试题汇总

Java常见面试题及答案汇总

程序员面试:八大数据结构及常见面试题

数据库常见面试题总结