Mysql面试题

一、事务的四大基本特征?
原子性:事务中的操作要么全成功,要么全失败,若事务执行到一半发现报错了,就会回滚该事务中之前做的操作,回到事务开始前的状态;
一致性:在执行事务之前,数据库是一致的,在执行事务之后,数据库也还是一致的;
持久性:事务提交之后,就会持久化到数据库;
隔离性:多个事务之间,彼此独立,互不影响;

二、事务的隔离级别?
1、读未提交(Read Uncommitted):所有事务都可以看到其他事务未提交的内容,解决不了任何并发问题;
2、读已提交(Read committed):所有事务只能读取其他事务已提交的内容,该隔离级别解决了脏读,但是未解决幻读和不可重复读问题;Oracle、PostgreSQL默认是该级别;
3、可重复读(Repeatable Read):无论其他事务是否修改并提交了数据,在该事务中读取数据,不受其他事务影响,始终是一致的;Mysql默认是该级别;
4、串行化(Serializable):隔离级别最高,所有的事务都只能串行执行,解决了脏读、不可重复读、幻读的并发问题,性能较差;

三、事务并发下可能产生哪些问题?
1、脏读:一个事务可以读取其他事务未提交的数据,比如事务A修改了一条数据,然后事务B读取了该数据,接着事务A由于发生了异常导致事务回滚了,所以最终事务B读取的数据是一条脏数据;
2、不可重复读:一个事务内,多次读取同一个数据,返回的值不一致导致的,比如:事务A读取了某一条id=1的数据,接着事务B修改了id=1的值并提交了,紧接着事务A又读取了id=1的数据,此时,上一次事务A读取的id=1的值和这一次读取的id=1的值不一致;在某些情况下,可能会产生影响;
3、幻读:一个事务两次读取的数据量不对叫做幻读,比如事务A读取id=1的时候为1条,此时事务B插入了一个id=1的数据并提交,然后事务A再次读取了id=1的时候,此时读取的数据量为2条,和第一次读取的数据量不一致;这个就叫做幻读;

四、不可重复读和幻读的区别?
不可重复读是针对更新和删除操作产生的,通过行级锁就可以避免,而幻读是插入操作产生的,需要加上表级锁才能避免;
不可重复读可以通过将事务的隔离级别调整成可重复度来解决;
幻读可以通过将事务的隔离级别调整成串行化来解决;

五、脏读和不可重复读的区别?
脏读指的是某一事务读取了其他事务未提交的数据;
不可重复读指的是某一个事务读取了其他事务已提交的数据;
脏读可以通过将事务的隔离级别调整成读已提交来解决;
不可重复读可通过将事务的隔离级别调整成可重复读来解决;

六、什么叫做事务?
事务指的是将多个SQL语句合并成一组逻辑单元;所有的sql要么都执行成功。要么都执行失败,如果其中有一个sql执行失败,事务就会回滚到执行事务开始时的状态;事务是为了保证数据的一致性和完整性,事务的隔离级别包括读未提交、读已提交、可重复读、串行化,事务的隔离级别越高,对应的在并发情况选可能产生的问题就会越小,但是性能也就越差,因此我们在做选择的时候,需要在性能和安全性之间做衡量;

七、delete、drop和truncate的区别?
drop会删除表结构和数据;
truncate会删除表全部数据;
delete删除指定的数据;
当我们不需要该表的时候,可以使用drop;
当我们不需要该表全部数据的时候,可以使用truncate;
当我们需要删除特定的数据的时候,可以使用delete;
删除数据的速度:drop > truncate > delete
delete属于DML语句,需要commit才能生效,可以回滚;
truncate、drop属于DDL语句,执行之后立即生效,不可与回滚;

八、什么是索引?
索引是一种数据结构,可以帮助我们快速的检索数据库中的对象;

九、索引具体用到了哪些数据结构呢?
索引主要分为Hash索引和B+树索引,因为我们用的是InnoDB引擎,所以我们使用的是B+ tree索引;

十、B+树索引和hash索引相比,有什么异同点?
hash索引的底层是哈希表,是通过key和value存储值的,所以多个数据在存储上是没有任何顺序而言的,所以对于区间查询是没有办法使用hash索引的,只可以用来做等值查询;
B+树是一种多路等值平衡树,所以他的节点是天然有序的,左子节点小于父节点,父节点小于右子节点,可以用来做区间范围内的检索;

hash索引没有办法通过索引来实现排序;
hash索引不支持多列联合索引的最左匹配规则;
在有大量重复键的情况下,会出现查询效率较慢的情况,因为会出哈希碰撞;

十一、我们知道InnoDB存储引擎使用了B+树,那么B+树的叶子节点存储了哪些数据呢?
InnoDb存储引擎的叶子节点上存储的是整行数据,也可能存储的是主键的值;

十二、B+数叶子节点上存储整行数据或者主键的值有什么区别呢?
叶子节点上存储区了整行数据称之为主键索引,也可以叫做聚簇索引,叶子节点上存储了主键的值的称之为非主键索引,也叫做非聚簇索引;
聚簇索引的查询效率会高于非聚簇索引,因为聚簇索引储存的整行数据可以直接返回,而非聚簇索引存储的是主键的值,需要用主键的值在查询一遍数据(回表);但也不是所有的查询都会这样,也可以通过覆盖索引只查询一次;
当一个查询复合覆盖索引条件时,就可以通过覆盖索引来一次性返回数据;
比如:表table_a有一个索引index_key1_key2(key1, key2)时
select key1 from table_a where key2 = 'a’就可以通过覆盖索引来查询;无需回表;

十三、了解联合索引吗?联合索引的情况下,是如何选择字段的顺序的呢?
一般是把识别度最高,最常用来作为检索的值放在前头,因为联合索引遵循最左前缀匹配,当我们创建一个联合索引index_lhsy(key1, key2, key3)相当于创建了(key1)、(key1,key2)、(key1,key2,key3)三个索引,这就是最左前缀匹配;

十四:、怎么判断一个sql语句是否用到了索引?
通过EXPLAIN来查看sql的执行计划,查看执行计划来查看索引的执行情况;

十五:为什么有时候建立了索引,而查询的时候不走索引呢?
因为查询的时候,数据库有优化器会帮我们判断是进行索引查询还是经过全表扫描的成本最低,优化器会帮我们选择成本你最低的执行方式来执行;
优化器大致的判断依据如下:
1.优化器先判断查询可能用到哪些索引;
2.计算进行全表扫描的效率;
3.计算使用不同的索引查询的效率;
4.对比全表扫描和使用索引的效率,选择一个查询成本最低的执行计划去执行;

十六、范式是什么?有哪些范式?
我们在设计数据库表的时候,一般为了让数据库允余较小,结构合理,故此设定了一些规则,这些规则叫做范式;
数据库有三大范式,分别是第一范式、第二范式、第三范式;
第一范式:数据库表所有字段值都是不可分割的原子值;
比如有一个表结构

name       age       class
小明			11		三年级二班

其中class就不符合第一范式,class可以分为年级和班级

name       age       grade			class
小明			11		三年级			二班

第二范式:所有字段和主键都是全部相关,而不是部分相关;
比如说有一张表selectCouse(学号,姓名,年龄,性别,学校,学校地址,学校建筑面积),其中主键是(学号,学校),我们会发现存在以下关系是不满足第二范式的;
(学号—>学校地址,学校建筑面积);
(学校—>姓名,性别,年龄);
所以我们可以将上述一张表拆成三张表;
student(学号,姓名,年龄,性别);
school(学校,学校地址,学校建筑面积);
student_school_relate(学号,学校);

第三范式:所有字段和主键必须是直接相关而不是间接相关;
比如说我们有一张表,selectCouse(学号,姓名,年龄,性别,学校,学校地址,学校建筑面积);其中主键是(学号),我们会发现存在以下关系导致不满足第三范式;
(学号—>学校地址);
(学号—>学校建筑面积);
我们可以将上述的表拆成两张表
student(学号,姓名,年龄,性别,学校);
school(学校,学校地址,学校建筑面积);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值