MySql面试题

为什么使用数据库

数据保存在内存

优点:存取速度快
缺点:数据不能永久保存

数据保存在文件

优点:数据永久保存
缺点:速度比内存操作满,频繁的io操作。查询数据不方便

数据保存在数据库
  1. 数据永久保存
  2. 使用SQL语句,查询方便效率高
  3. 管理数据方便

什么是MySQL

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,在web应用方面,MySQL是最好的RDBMS(关系数据库管理系统)应用软件之一,在java企业级开发种非常常用,因为是开源免费,并且方便扩展

数据库三大范式是什么

第一范式:每个列都不可再拆分
第二范式:在第一范式的基础上,非主键列只能依赖于主键,而不能是依赖于主键一部第三范式:在第二范式的基础上,非主键列只能依赖于主键,不依赖于其他非主键

MySql有关权限的表有哪几个

User权限表:记录允许连接到服务器的用户账号信息,里面的权限是全局的
db权限表:记录各个账号在各个数据库上的权限操作
table_priv权限表:记录数据表级的操作权限
columns_priv权限表:记录数据列级的操作权限
host权限表:配合db权限表对给定主机上数据库级操作权限作跟细致的控制。这个权限表不受GRANT和REVOKE语句的影响

索引

什么是索引

索引是一种特殊的文件,它们包含着对数据表里所有记录和引用指针
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的数据

索引有哪些优缺点

  • 优点:
    可以大大加快数据的检索速度,这也是创建索引的最主要的原因
    通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统的性能
  • 缺点:
    时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,会降低增/删/改的执行效率
    空间方面:索引需要占物理空间

索引有哪几种

主键索引:数据列不允许重复,不允许为null,一个表只能由一个主键
唯一索引:数据列不允许重复,允许为null,一个表允许多个列创建唯一索引
普通索引:基本的索引类型,没有唯一性的限制,允许null
全文索引:是目前搜索引擎使用的一种关键技术

事务

什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

事物的四大特性(ACID)介绍一下?

关系性数据库需要遵循ACID规则,具体内容如下:
MySql面试题

  1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

什么是脏读?幻读?不可重复读?

  • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

什么是死锁?怎么解决?

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

  1. 如过不同得长须会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁的机会;
  2. 在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率
    如果业务处理不好可以用分布式事务锁或乐观锁

数据库的乐观锁和悲观锁是什么?怎么实现的?

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,在查询完数据的时候就把事务锁起来,知道提交事务。
实现方式:使用数据库中的锁机制
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务所起来,通过version的方式来进行锁定
实现方式:一般使用版本号机制或CAS算法实现。

两种锁的使用场景
乐观锁是用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁比较合适

什么是存储过程?有哪些优缺点?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后再该程序中就可以多次调用。如果某次操作需要执行多次SQL,使用存储过程比单纯的SQL语句执行要快
优点:

  1. 存储过程时预编译过的,执行效率高。
  2. 存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
  3. 安全性高,执行存储过程需要有一定用户权限
  4. 存储过程可以重复使用,减少数据库开发人员的工作量

缺点

  1. 调试麻烦
  2. 移植问题,数据库端代码当然是与数据库相关的,但是如果时做工程型项目,基本不存在移植的问题
  3. 重新编译问题,因为后端代码是运行前编译,如果带有引用关系的对象发生改变时,受影响的存储过程,将需要重新编译
  4. 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价时空前的,维护起来更麻烦

什么是触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。

使用场景

  • 可以通过数据库中的相关表实现级联更改。
  • 实时监控某张表中的某个字段的更改而需要做出相应的处理。
  • 例如可以生成某些业务的编号。
  • 注意不要滥用,否则会造成数据库及应用程序的维护困难。
  • 大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异,表存储引擎InnoDB和MyISAM的区别。