Mysql面经

Mysql面经

1 OR连接是否会使用索引

只有只有把OR连接条件的字段全部都设置索引的时候,才会使用索引,否则将不会使用索引。

2 NULL是什么意思?

Null表示这个字段值未知,尚未存储数据库字段值,它不表示“ ”(空字符串),无法将Null与值进行比较,使用IS NULL或IS NOT NULL来进行NULL判断

3 InnoDB 和 MyISAM 的区别有哪些

1 InnoDB 支持事务,MyISAM 不支持
2 聚簇索引,非聚簇索引
3 支持外键,不支持外键
4 行级锁表级锁都支持,默认行级锁,仅支持表级锁
5 不支持全文索引,支持全文索引,效率高!

4 聚簇索引和非聚集索引

1 一个表中只有一个聚簇索引,可以有多个非聚簇索引。
2 聚簇索引中键的逻辑顺序决定了表中相应行的物理顺序,非聚簇不同。
3 mysql中是二叉树的存储结构,聚簇索引树中的叶子结点相当于数据结点,而非聚簇索引的叶子结点是存放指向数据的指针。
例:通常id是作为聚簇索引,name是非聚簇,查询name时查到相应的指针,这个指针指向id=xxx的数据。这个操作也称之为回表。

5 如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被修改时,时间戳会更改为当前时间戳。

6 超键、候选键、主键、外键

超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
主键(primary key): 用户选作元组标识的一个候选键程序主键
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

例如:学生信息(学号 身份证号 性别 年龄 身高 体重 宿舍号)和 宿舍信息(宿舍号 楼号)

超键:只要含有“学号”或者“身份证号”两个属性的集合就叫超键,例如R1(学号 性别)、R2(身份证号 身高)、R3(学号 身份证号)等等都可以称为超键!
候选键:不含有多余的属性的超键,比如(学号)、(身份证号)都是候选键,又比如R1中学号这一个属性就可以唯一标识元组了,而有没有性别这一属性对是否唯一标识元组没有任何的影响!
主键:就是用户从很多候选键选出来的一个键就是主键,比如你要求学号是主键,那么身份证号就不可以是主键了!
外键:宿舍号就是学生信息表的外键

7 一张表,里面有ID自增主键,当insert了16条记录之后,删除了第15,16条记录,再把Mysql重启,再insert一条记录,这条记录的ID是17还是15 ?

如果表的存储引擎类型是MyISAM,ID就是17,因为MyISAM类型的表会把自增的最大ID记录在数据文件里,即使Mysql重启,最大ID也不会丢失。而如果表的存储引擎类型是InnoDb,因为InnoDb类型的表只会把自增的最大ID存在内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。

8 说说MyISAM类型的表是怎么存储的?

三个文件:存数据,存索引,存表的定义
每个MyISAM表都会有三种文件格式存储在磁盘上,“.frm"文件存储表定义,”.MYD"文件存储数据,".MYI"文件存储索引。

9 说说数据库的三范式?

答:
第一范式:数据库表的每一列都是不可分割的原子数据项。
第二范式:非主键列完全依赖于主键,而不能只是依赖于主键的一部分。第二范式要求每个表只描述一
件事情。
第三范式:非主键列只依赖于主键,不依赖于其他非主键。

10 char和varchar区别

最大长度:char最大长度是255字符,varchar最大长度是65535个字节。
定长:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。
空间使用:char会浪费空间,varchar会更加节省空间。
查找效率:char查找效率会很高,varchar查找效率会更低。
尾部空格:char插入时可省略,vaechar插入时不会省略,查找时省略。

11 LIKE 声明中的%和_是什么意思

%匹配0个或者多个字符,_匹配单个字符

12 MYSQL支持事务吗

mysql好文
事务:是一种机制、一个操作序列,是访问和更新数据库的程序执行单元,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。
MYSQL支持事务吗
在缺省模式下,MySQL 是 autocommit 模式的,如果没有start transaction显式地开始一个事务,那么每个sql语句都会被当做一个事务执行提交操作。如果关闭了autocommit,则所有的sql语句都在一个事务中,直到执行了commit或rollback,该事务结束,同时开始了另外一个事务。

undo log

InnoDB实现回滚,靠的是undo log:当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。对于每个insert,回滚时会执行delete;对于每个delete,回滚时会执行insert;对于每个update,回滚时会执行一个相反的update,把数据改回去。

redo log 保证持久化

InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。
于是,redo log被引入来解决这个问题:当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。
既然redo log也需要在事务提交时将日志写入磁盘,为什么它比直接将Buffer Pool中修改的数据写入磁盘(即刷脏)要快呢?主要有以下两方面的原因:
(1)刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO。
(2)刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入;而redo log中只包含真正需要写入的部分,无效IO大大减少

MVCC 多版本并发控制(保证隔离性)

InnoDB 每一行数据都有一个隐藏的回滚指针,用于指向该行修改前的最后一个历史版本,这个历史版
本存放在 undo log 中。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指
向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版
本。
MVCC 最大的好处是读不加锁,读写不冲突,极大地增加了 MySQL 的并发性。通过 MVCC,保证了事
务 ACID 中的 I(隔离性)特性。
在这里插入图片描述

13 覆盖索引

所要查询的字段都存在于索引结构中,不需要回表。
如第二句sql,select后的id、name都存在于索引结构中,不需要回表,第三句sql,gender字段不存在索引结构中,要回表,故不能称之为覆盖索引。
*注:这也就是为什么减少用select 操作(* 容易出现非覆盖索引,导致效率低)

在这里插入图片描述
对于以下这种情况的优化,将uername和password建立联合索引,使其变成覆盖索引。
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值