本篇文章为博主面试过程中所遇到的一些关于MySQL的面试题,特此进行整理并分享给大家
目录
本篇文章为博主面试过程中所遇到的一些面试题,特此进行整理并分享给大家
1、where与having区别
-
where和having都是为了完成数据的过滤,他们后面都是添加条件
-
where是在group by之前完成过滤
-
having是在group by之后完成过滤
2、内连接与外连接的区别
-
内连接:取出两张表中匹配到的数据,匹配不到的不保留
-
外连接:取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
-
左外连接:以左边的表为主表
-
右外连接:以右边的表为主表
-
3、varchar与char对比
-
varchar比较智能,可以根据实际的数据长度分配空间,比较节省空间,但在分配的时候需要相关判断
-
char不需要动态分配空间,所以执行效率高,但是可能会导致空间浪费
-
若字段中的数据不具备伸缩性,建议采用char类型存储
-
若字段中的数据具有很强的伸缩性,建议采用varchar类型存储
4、什么是数据库事务?
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
5、介绍一下事务具有的四个特征
1、 原子性。原子性是指包含事务的操作要么全部执行成功,要么全部失败回滚。
2、 一致性。一致性指事务在执行前后状态是一致的。
3、 隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的//操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、 持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
6、什么是脏读?幻读?不可重复读?
1、脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果 不一致。
3、幻读:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
7、为什么要加锁?
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
8、从锁的类别上分MySQL都有哪些锁呢?
1、共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
2、排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
9、什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
10、什么是索引?
索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。
11、索引的种类有哪些?
-
主键索引:数据列不允许重复,不能为NULL,一个表只能有一个主键索引
-
组合索引:由多个列值组成的索引。
-
唯一索引:数据列不允许重复,可以为NULL,索引列的值必须唯一的,如果是组合索引,则列值的组合必须唯一。
-
全文索引:对文本的内容进行搜索。
-
普通索引:基本的索引类型,可以为NULL
12、索引的优缺点?
优点:
-
大大加快数据检索的速度。
-
将随机I/O变成顺序I/O(因为B+树的叶子节点是连接在一起的)
-
加速表与表之间的连接
缺点:
-
从空间角度考虑,建立索引需要占用物理空间
-
从时间角度考虑,创建和维护索引都需要花费时间,例如对数据进行增删改的时候都需要维护索引。
13、数据库为什么使用B+树而不是B树?
-
B树适用于随机检索,而B+树适用于随机检索和顺序检索
-
B+树的空间利用率更高,因为B树每个节点要存储键和值,而B+树的内部节点只存储键,这样B+树的一个节点就可以存储更多的索引,从而使树的高度变低,减少了I/O次数,使得数据检索速度更快。
-
B+树的叶子节点都是连接在一起的,所以范围查找,顺序查找更加方便
-
B+树的性能更加稳定,因为在B+树中,每次查询都是从根节点到叶子节点,而在B树中,要查询的值可能不在叶子节点,在内部节点就已经找到。
14、什么是聚簇索引,什么是非聚簇索引?
聚簇索引和非聚簇索引最主要的区别是数据和索引是否分开存储。
-
聚簇索引:将数据和索引放到一起存储,索引结构的叶子节点保留了数据行。
-
非聚簇索引:将数据进和索引分开存储,索引叶子节点存储的是指向数据行的地址。
在InnoDB存储引擎中,默认的索引为B+树索引,利用主键创建的索引为主索引,也是聚簇索引。
15、索引的使用场景有哪些?
-
对于中大型表建立索引非常有效,对于非常小的表,一般全部表扫描速度更快些。
-
对于超大型的表,建立和维护索引的代价也会变高,这时可以考虑分区技术。
-
如何表的增删改非常多,而查询需求非常少的话,那就没有必要建立索引了,因为维护索引也是需要代价的。
16、索引在什么情况下会失效?
-
条件中有or,例如select * from table_name where a = 1 or b = 3
-
在索引中使用函数会导致索引失效,例如select * from table_name where abs(a) = 1
-
在使用like查询时以%开头会导致索引失效
-
索引上使用!、=、<>、is null、is not null进行判断时会导致索引失效,例如select * from table_name where a != 1