MySQL面经

 

面试中经常是由浅及深顺着一条线问下去 , 下面仅列出我遇到过的面试问题:

1.基础三连问

关系型数据库与非关系型数据库有什么区别?

MySQL有哪些存储引擎?有什么区别?

  1. InnoDB支持事务,MyISAM不支持
  2. 对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
  3. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  4. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
  5. 但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太大,其他索引也都会很大。
  6. 而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  7. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  8. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高

如何优化 MySQL?

  • 数据表结构的优化,合理的字段类型 字段定义为not null   char varchar int 
  • SQL 语句及索引的优化
  • 系统配置的优化
  • 硬件的优化
  • ......

char varchar 区别?

        char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充)

        varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。

索引的类型有哪些?

     主键索引 普通索引 唯一索引 组合索引 全文索引

你是如何判断索引生效的? 

Explain 的查询结果会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的,一般来说,要看到尽量用 index(type 为 const、 ref 等, key 列有值),避免使用全表扫描(type 显式为 ALL)。比如说有 where 条件且选择性不错的列,需要建立索引。

组合索引(联合索引) 的索引生效原则?(重点)

     最左优先原则 

 

2. 进阶连环问

索引为什么能加快查询效率?

https://blog.csdn.net/u013308490/article/details/83001060

索引提高了查询速度对增删改有影响吗?

索引常用的算法原理分析B树和B+树等

MySQL事物四大特征?隔离级别?默认隔离级别?

     https://www.jianshu.com/p/081a3e208e32

项目中用到数据库锁简单介绍?

     悲观锁 乐观锁 

数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。其特点为特点是先获取锁,再进行业务操作。一般在数据库我们使用 select … for update 来实现悲观锁。当数据库执行 select … for update 时会获取被 select 中的数据行的行锁,因此其他并发执行的 select … for update 如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update 获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。(注意:在 MySQL 中, select… for update 语句执行中所有扫描过的行都会被锁上,所以如果在 MySQL 中用悲观锁务必要确定使用了索引,而不是全表扫描)
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁的特点先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过,若未被更新过,则更新成功;否则,失败重试。乐观锁一般的做法是在需要锁的数据上增加一个版本号或者时间戳。然后操作如下:

1. SELECT data AS old_data, version AS old_version FROM …;
2. 根据获取的数据进行业务操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
    // 乐观锁获取成功,操作完成
} else {
    // 乐观锁获取失败,回滚并重试
}


 

mysql主从复制原理?

1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;
3. 从:sql执行线程——执行relay log中的语句

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值