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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 毕业季--数据库常见面试题

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语句是否使用到了索引,是否使用索引下推这些功能,然后针对性的进行性能的优化。

  1. 优化sql。最左匹配原则,避免使用like,like有可能会导致索引失效。避免使用or。尽量使用覆盖索引。 模型数空运最快,模糊查询,查询类型不匹配,字段上的函数运算,查询is null或者is not null,在字段上面做运算,都要尽量避免。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 缓存 数据库
C/C++工程师面试题(数据库篇)
C/C++工程师面试题(数据库篇)
118 9
|
6月前
|
存储 关系型数据库 MySQL
【面试宝藏】MySQL 面试题解析
MySQL面试题解析涵盖数据库范式、权限系统、Binlog格式、存储引擎对比、索引原理及优缺点、锁类型、事务隔离级别等。重点讨论了InnoDB与MyISAM的区别,如事务支持、外键和锁机制。此外,还提到了Unix时间戳与MySQL日期时间的转换,以及创建索引的策略。
125 4
|
4月前
|
SQL 存储 关系型数据库
|
7月前
|
存储 关系型数据库 数据库
数据库程序设计(毕业选题系统)
数据库程序设计(毕业选题系统)
145 0
|
7月前
|
SQL 关系型数据库 MySQL
毕业季--数据库常见面试题
毕业季--数据库常见面试题
|
SQL 数据库 索引
自考实践课——数据库
自考实践课——数据库
77 0
|
SQL 存储 人工智能
104. 史上最全的数据库面试题,面试前刷一刷(一)
104. 史上最全的数据库面试题,面试前刷一刷(一)
107 1
104. 史上最全的数据库面试题,面试前刷一刷(一)
|
存储 关系型数据库 MySQL
MySQL复习资料——用于突击考试总结
MySQL复习资料——用于突击考试总结
186 0
|
SQL 算法 关系型数据库
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(七)
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(七)
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(七)
|
SQL 关系型数据库 MySQL
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(三)
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(三)
带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(三)