一个互联网产品的架构通常包含接入层、逻辑处理层以及存储层,其中存储层承载着数据落地和持久化的任务,同时给逻辑处理层提供数据查询功能支持。
那么提到存储层必然就要说到数据库,对数据库的掌握程度也是软件测试工程师面试考察的必要知识点之一。
给大家准备了一些关于MySQL数据库的经典面试题,可以多参考多学习。
01
用一句话介绍什么是MySQL?
MySQL是一个开源的关系型数据管理系统,用于存取数据、查询、更新和管理数据。
02
对MySQL数据库去重的关键字是什么?
selectdistinct字段名from表名数据库自带的distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段。
03
MySQL多表连接有哪些方式?怎么用的?这些连接都有什么区别?
连接方式:左连接、右连接、内连接
使用方法:
左连接:select*fromALEFTJOINBonA.id=B.id;
右连接:select*fromARIGHTJOINBonA.id=B.id;
内连接:select*fromAinnerjoinBona.xx=b.xx;(其中inner可以省略)
区别:
Innerjoin内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
leftjoin在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
rightjoin在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
04
MySQL数据库和Redis的区别?
MySQL和Redis都可以存放数据,但MySQL里的数据是永久的,而Redis里的数据是缓存并有缓存机制,新的数据过来,老的数据会根据缓存机制失效。但是从Redis中读取数据比较快方便,而MySQL里的逻辑复杂,数据量大,读取数据耗时长。
05
说一下索引的优势和劣势?
优势:
唯一索引可以保证数据库表中每一行数据的唯一性索引可以加快数据查询速度,减少查询时间
劣势:
创建索引和维护索引要耗费时间索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间给表中的数据进行增、删、改的时候,索引也要动态的维护。
06
什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
有四个必要条件:互斥条件,请求和保持条件,环路等待条件,不剥夺条件。
解决死锁思路,一般就是切断环路,尽量避免并发形成环路。如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会;在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;如果业务处理不好可以用分布式事务锁或者使用乐观锁;死锁与索引密不可分,解决索引问题,需要合理优化索引。
07
什么是视图?为什么要使用视图?
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。
08
视图有哪些特点?使用场景有哪些?
视图特点:
视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。视图是由基本表(实表)产生的表(虚表)。视图的建立和删除不影响基本表。对视图内容的更新(添加,删除和修改)直接影响基本表。当视图来自多个基本表时,不允许添加和删除数据。
视图用途:简化sql查询,提高开发效率,兼容老的表结构。
视图的常见使用场景:
重用SQL语句;简化复杂的SQL操作。使用表的组成部分而不是整个表;保护数据更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
09
讲一下视图的优缺点?
查询简单化。视图能简化用户的操作数据安全性。视图使用者能以多种角度看待同一数据,能够对机密数据提供安全保护逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性
10
MySQL的约束有哪些?
NOTNULL:约束字段的内容一定不能为NULL。
UNIQUE:约束字段唯一性,一个表允许有多个Unique约束。PRIMARYKEY:约束字段唯一,不可重复,一个表只允许存在一个。FOREIGNKEY:用于预防破坏表之间连接的动作,也能防止非法数据插入外键。CHECK:用于控制字段的值范围。
11
UNION和UNIONALL的区别?
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;UnionAll:对两个结果集进行并集操作,包括重复行,不进行排序;UNION的效率高于UNIONALL
12
关心过业务系统里面的sql耗时吗?对慢查询都怎么优化过?
分析语句,是否加载了不必要的字段/数据。分析SQL执行语句是否命中索引等。如果SQL很复杂,优化SQL结构如果表数据量太大,考虑分表情况
13
主键使用自增ID还是UUID,为什么?
如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID,但还是最好公司自己有一套分布式唯一ID生产方案。自增ID:数据存储空间小,查询效率高。但是如果数据量过大,会超出自增长的值范围,多库合并,也有可能出现问题。uuid:适合大量数据的插入和更新操作,但它是无序的,插入数据效率慢,占用空间大。
14
MySQL数据库cpu飙升的话,要怎么处理呢?
排查过程:
使用top命令观察,确定是mysqld导致还是其他原因。
如果是mysqld导致的,showprocesslist,查看session情况,确定是不是有消耗资源的sql在运行。
找出消耗高的sql,看看执行计划是否准确,索引是否缺失,数据量是否太大。
处理:
kill掉这些线程(同时观察cpu使用率是否下降),
进行相应的调整(比如说加索引、改sql、改内存参数)
重新跑SQL。
其他情况:
也有可能是每个sql消耗资源并不多,但是突然之间,有大量的session连进来导致cpu飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。
15
什么是存储过程?有哪些优缺点?
存储过程,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法实现一些功能(对单表或多表的增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。
优点:
存储过程是一个预编译的代码块,执行效率比较高存储过程在服务器端运行,减少客户端的压力允许模块化程序设计,只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用一个存储过程替代大量SQL语句,可以降低网络通信量,提高通信速率可以一定程度上确保数据安全
缺点:
调试麻烦可移植性不灵活存在重新编译问题
16
日常工作中,你是怎么优化sql的?
可以从这几个维度回答这个问题:
加索引避免返回不必要的数据适当分批量进行优化sql结构分库分表读写分离
17
什么情况下应不建或少建索引?
表记录太少
经常插入、删除、修改的表
数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
经常和主字段一块查询但主字段索引值比较多的表字段
18
了解什么是表分区吗?表分区的好处有哪些?
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。
存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据。
优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问。