史上最全MySQL面试题及答案

本文详细介绍了MySQL面试中常见的知识点,包括事务的四大特性、隔离级别、表类型、InnoDB引擎特性、行锁实现方式、MyISAM与InnoDB的区别、索引类型、SQL语句优化策略、表结构优化建议、存储过程与触发器、外键的优缺点、视图和游标的概念、数据库三范式以及MySQL中不同复制类型的区别等。内容深入浅出,适合准备MySQL面试的开发者参考。
摘要由CSDN通过智能技术生成
1.事务的基本特征
  • 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
  • 一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。
  • 隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
2.事务的隔离级别,mysql默认的隔离级别是什么?
  • 读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。
  • 读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。
  • 可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。
  • 串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。Mysql的默认隔离级别是Repeatable read。
3.说一说脏读、不可重复读、幻读
  • 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;
  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致;
  • 幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性);
4.数据表类型有哪些

MyIASM、InnoDB、HEAP、ISAM、MERGE、DBD以及Gemeni(一般只知道前两者即可)

5.innodb引擎的4大特性

插入缓冲(insert buffer);二次写(double write);自适应哈希索引(ahi);预读(read ahead)

6.InnoDB引擎的行锁是通过加在什么上实现的?

基于索引;

7.Mysql中的myisam与innodb的区别,至少五点
  • InooDB支持事务,而MyISAM不支持事务;
  • InnoDB支持行级锁,而MyISAM支持表级锁;
  • InnoDB支持MVCC,而MyISAM不支持;
  • InnoDB支持外键,而MyISAM不支持;
  • InnoDB不支持全文索引,而MyISAM支持;
  • InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持;
  • InnoDB表支持多种行格式, myisam 不支持;
  • InnoDB是索引组织表, myisam 是堆表;
8.myisam与innodb select count(*)哪个更快,为什么

myisam更快,因为myisam内部维护了一个计数器,可以直接调取。

9.数据库三大范式
  • 第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);
  • 第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。
  • 第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)
10.说一说你能想到的sql语句优化,至少五种
  • 避免select *,将需要查找的字段列出来;
  • 使用连接(join)来代替子查询;
  • 拆分大的delete或insert语句;
  • 使用limit对查询结果的记录进行限定;
  • 用 exists 代替 in 是一个好的选择;
  • 用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤;
  • 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引尽量避免在where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描;
  • 尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;
11.说一说你能想到的表结构优化,至少五种永远为每张表设置一个ID
  • (所有建表的时候不设置主键的程序猿都应该被辞退);选择正确的存储引擎 ;
  • 使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob;
  • 使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数;
  • 使用合理的字段属性长度,固定长度的表会更快。
  • 使用enum、char而不是varchar;
  • 尽可能使用not null定义字段(给空字段设置默认值);
  • 尽量少用text;给频繁使用和查询的字段建立合适的索引;
12.说几个mysql中你常用的函数

sum、count 、avg、min、max

13.说几个你除了增删改查之外在mysql中常用的命令

Explain、describe、show、truncate

14.说几个除了增删改查之外常用的关键字答

distinct、limit、offset、order by、union、union all、between、group by;

15.union、union all的区别
  • 对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录;
  • 对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回;
    从效率上说,UNION ALL 要比UNION快很多
16.varchar(100)和varchar(200)的区别
  • varc
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值