MySQL常见简单面试题

1、MySQL 索引使用有哪些事项呢?

要注意索引失效情况;要添加的索引是否合适;注意索引规则等等

索引失效情况:

  • like通配符可能导致索引失效;
  • 对索引列进行运算,索引失效;
  • 对于联合索引,查询的条件不是联合索引中的第一个列,索引失效;
  • 如果字段类型是字符串,where时一定用引号括起来,否则索引失效;
  • 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。、
  • 查询条件包含or,可能导致索引失效;
  • 索引字段上使用is null, is not null,可能导致索引失效。

索引不适合那些场景:

  • 数据量少的不适合添加索引;
  • 更新比较频繁的字段不适合添加索引;

2、 InnoDB与MyISAM的区别

  • InnoDB支持事务,MyISAM不支持事务
  • InnoDB支持表、行级锁,而MyISAM支持表级锁。
  • select count(*) from table时,MyISAM更快,因为它有一个变量保存了整个表的总行数,可以直接读取,InnoDB就需要全表扫描。

3、B树和B+树的区别,数据库为什么使用B+树而不是B树?

B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。

4、在高并发情况下,如何做到安全的修改同一行数据?

(1)使用乐观锁:给数据添加版本号字段,所有请求都有资格修改,但会取得这条数据的版本号,只有版本号符合的才能更新成功,缺点是增加cpu计算;

(2)使用悲观锁:本质是当前只有一个线程执行操作,排斥其他请求修改。就是其他线程遇到加锁的情况,必须等待,等持有锁的线程释放锁之后,其他线程再去处理,这样虽然解决的数据安全问题,遇到高并发时,会导致死锁或者响应时间过长;

5、数据库的乐观锁和悲观锁。

悲观锁:悲观锁缺乏安全感了,只属于当前事务,每时每刻都担心当前的数据可能被别的事务修改,所以一个事务拥有(获得)悲观锁后,其他任何事务都不能对数据进行修改,只能等待锁被释放才可以执行。

乐观锁:乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。实现方式:乐观锁一般会使用版本号机制或CAS算法实现。

6、SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。

type : 表示 mysql 在表中找到所需行的方式,或者叫访问类型,常见类型性能由差到最好依次是:all、index、range、ref、eq_ref、const,system、null:

type部分值的含义:
type=ALL,全表扫描,mysql 遍历全表来找到匹配的行
type=index, 索引全扫描,mysql 遍历整个索引来查询匹配的行
type=range,索引范围扫描,常见于<、<=、>、>=、between等操作:
type=ref, 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行

7、mysql里记录货币用什么字段类型比较好?

numeric(m,n)和decimal(m,n),都是存的总位数,小数位数

8、Mysql中有哪几种锁,列举一下?

(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

(3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

9、 什么是内连接、外连接和左连接?(重要)

(1)Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集;

(2)left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录;

(3)right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录;

10、说一下数据库的三大范式

(1)第一范式:数据库中每一列(每个字段)都不可以再拆分;

(2)第二范式:在第一范式的基础上,非主属性完全依赖于主键;

(3)第三范式:在第二范式的基础上,不存在非主属性对码的传递函数依赖

(4)BC范式:在第三范式的基础上,不存在主属性对码的部分函数依赖和传递函数依赖

11、索引有哪几种类型?

  • 主键索引:数据列不允许重复,不允许为null,一个表只能有一个主键;
  • 唯一索引:数据列不允许重复,允许为null值,一张表可以有多个唯一索引,但是一个唯一索引只能包含一列;
  • 普通索引:一张表可以创建多个索引,一个普通索引可以包含多个字段,允许数据重复,允许null值插入;
  • 覆盖索引:查询列要被所建的索引覆盖,不必读取数据行

12、什么是最左前缀原则?

当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

发生在联合索引里面,举个例子,创建联合索引为key idx_a_b_c(a,b,c)

sql 是否使用索引
where a = x and b = x and c = x
where a = x and b = x 是,部分索引
where a = x 是,部分索引
where b = x 否,不包含最左列a
where b = x and c = x 否,不包含最左列a

使用索引排序时,order by 也遵循最左前缀原则。

原理: b+ 树的数据项是复合的数据结构,比如 (name,age,sex) 的时候,b+ 树是按照从左到右的顺序来建立搜索树的,比如当 (张三,20,F) 这样的数据来检索的时候,b+ 树会优先比较 name 来确定下一步的所搜方向,如果 name 相同再依次比较 age 和 sex,最后得到检索的数据;但当 (20,F) 这样的没有 name 的数据来的时候,b+ 树就不知道第一步该查哪个节点,因为建立搜索树的时候 name 就是第一个比较因子,必须要先根据 name 来搜索才能知道下一步去哪里查询,所以索引列的顺序很重要。

13、覆盖索引、回表等这些,了解过吗?

覆盖索引:指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了
尽量减少 select * 操作

14、什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象.

死锁有四个必要条件:互斥条件请求和保持条件循环等待条件不剥夺条件

15、为什么要使用视图?什么是视图?

视图是一个虚拟的表,是数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。

通过视图,可以展现基表的部分数据;
视图数据来自定义视图的查询中使用的表,使用视图动态生成。
基表:用来创建视图的表叫做基表

16、视图有哪些特点?哪些使用场景?

特点:

(1)视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系;
(2)视图是由基本表(实表)产生的表(虚表);
(3)视图的建立和删除不影响基本表,但是对视图内容的更新(添加,删除和修改)直接影响基本表
(4)当视图来自多个基本表时,不允许添加和删除数据。

使用场景:

(1)重用SQL语句;
(2)使用表的组成部分而不是整个表;
(3)保护数据

17、什么是触发器?触发器的使用场景有哪些?

指一段代码,当触发某个事件时,自动执行这些代码。

MySQL 数据库中有六种触发器:

(1)Before Insert
(2)After Insert
(3)Before Update
(4)After Update
(5)Before Delete
(6)After Delete

18、delete、delete与truncate的区别

  • delete:删除数据,可以是表,也可以是视图,可以回滚;
  • truncate:删除表中所有数据,保留表结构,会隐式提交,所以不能回滚,不会触发触发器;
  • drop:删除表中所有数据和表结构

19、UNION与UNION ALL的区别?

  • UNION:对两个结果集进行并集操作,不包括重复行(会去重),同时进行默认规则的排序;

  • UNION All:对两个结果集进行并集操作,包括重复行,不进行排序;

    UNION ALL 的效率高于 UNION

20、exists和in的区别

exists:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。exist适合外表数据少,内表数据大

in:in适合外表数据量大,内表数据量小的情况

21、 MySQL的主从复制原理以及流程

  • 主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程)
  • 从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程)
  • 从数据库的relay-log重做日志文件中再执行一次这些sql语句。(Sql执行线程)

题目和答案都是根据下边的链接整理的一些我认为重要的,更多更详细的请看下边链接:https://github.com/whx123/JavaHome/blob/master/Java%E9%9D%A2%E8%AF%95%E9%A2%98%E9%9B%86%E7%BB%93%E5%8F%B7/%E6%95%B0%E6%8D%AE%E5%BA%93/100Mysql%E7%AD%94%E6%A1%88.md

你可能感兴趣的:(MySQL,mysql,数据库,面试)