JAVA面试题总结-MySql(164-178)

164.数据库的三范式是什么?

第一范式:原子不可再分,即每个属性都是不可分割的原子项。

第二范式:满足第一范式的同时,不存在部分依赖,即非主键列要完全依赖于主键列。

第三范式:满足第二范式的同时,不存在传递依赖,即非主键之间不能有依赖关系。

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

表的引擎不同,结果也不同。

如果表的引擎类型是MyISAM,此时id为8,因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL后,自增主键的最大ID不会丢失。

如果表的引擎类型是InnoDB,此时id可能为8也可能为6。主要看MySQL版本。 MySQL8之前id值为6,InnoDB表会把自增主键的最大ID记录到内存中,所以重启MySQL之后,自增主键的最大ID会丢失,数据库会重新计算最大ID,将其存入内存。

MySQL8之后,每次对数据库进行更改都会写入重做日志,所以不会丢失最大ID。

166.如何获取当前数据库版本?

mysql -version

167.说一下 ACID 是什么?

原子性(Atomicity):事务作为一个整体被执行,对数据库的操作,要不都执行,要不都不执行。

一致性(Consistency):指事务开始之前和结束以后,数据不会被破坏,假设A给B转账10块钱,无论成功与否,A和B的总金额都不变。

隔离性(Isolation):指多个事务并发访问时,事务之间是相互隔离的,即一个事务的操作不影响其他事务。

持久性(Durability):指事务完成之后,对数据库的修改是永久性的。

那么ACID是靠什么保证的呢?

事务的隔离性是靠数据库锁机制实现的。

事务的一致性是靠undolog,逻辑日志保证,记录了事务的操作,回滚的时候会有相反的操作来恢复。

事务的原子性和持久性是靠redolog,重做日志保证,事务提交的时候,先将事务的所有日志写入redo log重做日志中持久化。

168.char 和 varchar 的区别是什么?

char表示定长字符串,长度是固定的,如果插入数据的长度小于char的固定长度,则用空格填充,因为长度是固定的,所以存取速度要比varchar快,但是会占据多余的空间,是空间换时间的做法。

varchar表示可变字符串,长度是可变的,插入的数据是多长,就按多长来存储,varchar存取速度慢,但是不多占空间,是时间换空间的做法。

日常设计中,对于长度相对固定的字符串使用char,对于长度不确定的用varchar。

169.float 和 double 的区别是什么?

float是单精度浮点数值,double是双精度浮点数值。

float使用4个字节存储,double使用8个字节存储。

float在处理器上比double更快并且占用内存小,但是当值很大或者很小的时候,就会变得不准确。

double精度,尾数可以有16位,而float只有7位,但是计算起来有开销。

decimal类型在存储同样范围的值时,会使用更少的空间,实际的企业级开发中,遇到存储金额的字段一般用到decimal数据类型。通常设置小数的时候也用decimal。

170.mysql 的内连接、左连接、右连接有什么区别?

内连接:也称等值连接,结合两张表的记录,返回相关的查询结果,返回的是两张表的交集。用 inner join

左连接:也称左外连接,左表的信息全部展示出来,右表只会展示符合查询结果的信息,即使右表中没有匹配的记录。用 left join

右连接:也称右外连接,右表的信息全部展示出来,左表只会展示符合查询结果的信息,即使左表中没有匹配的记录。用 right join

171.mysql 索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高校查找数据。

从执行效率方面,我们希望通过索引查询效率尽可能的高,在存储空间方面,我们希望索引不要消耗太多的空间。

具体来说MySQL中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎所用的索引都是B+树实现的,B+是B树演变,它通过存储在磁盘的多叉树结构,做到了时间、空间的平衡,即保证了执行效率,又节省了内存。

B+树的叶子节点通过双向链表串起来,支持前后遍历。节点不存储数据,只存储索引。

172.怎么验证 mysql 的索引是否满足需求?

使用explain查看SQL是如何执行查询语句的,从而分析索引是否满足需求。

语法:

explain select * from table where type=1

173.说一下数据库的事务隔离?

MySQL的事务隔离是在MySQL.ini配置文件里添加的。

一共有四个配置值:

读未提交(READ-UNCOMMITTED):最低隔离级别,事务未提交前,就可被其他事务读取。会造成脏读,幻读,不可重复读。

读已提交(READ-COMMITTED):一个事务提交之后才能被其他事务读取到。会造成幻读,不可重复读。

可重复读(REPEATABLE-READ):MySQL默认事务隔离级别,保证多次读取同一个数据时,值和事务开始时候的内容是一致的,禁止读取到别的事务未提交的数据,会造成幻读。

序列化(SERIALIZABLE):代价最高最可靠的隔离级别,能防止脏读,幻读,不可重复读。

脏读:事务A、B交替执行,事务A读取到事务B未提交的数据。

不可重复读:在一个事务内,两个相同的查询,读取同一条数据,却返回不同的结果。

幻读:同一个事务内多次查询返回的结果集不一样,事务A第一次查询结果集有n条记录,在这时事务B修改了结果集里的记录,并偷偷提交,事务A再次查询结果集发现记录条数改变。

174.说一下 mysql 常用的引擎?

MySQL常用的引擎有两个:MyISAM和InnoDB

MyISAM:不支持事务,也不支持行锁和外键,因此当执行插入和更新操作时,会用表锁锁住整张表,因此效率相对低,MyISAM存储了表的行数,当执行查找表行数时直接调用,不需要扫描整张表,如果表的读操作远大于写操作,且不需要事务加持的条件下,可以使用MyISAM引擎。

InnoDB:提供了事务的支持,也支持行锁和外键,他设计的目标是处理大数据容量的数据库系统,MySQL运行时,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引,当执行查找表行数时需要扫描整张表。在并发度较高的场景下会提交效率。

老版本MySQL默认引擎是MyISAM,新版本默认引擎是InnoDB。

175.说一下 mysql 的行锁和表锁?

MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。

表锁:开销小,加锁快,不会出现死锁,锁粒度大,发生锁冲突概率高,并发量低。

行锁:开销大,加锁慢,会出现死锁,锁粒度小,发生锁冲突概率低,并发量高。

176.说一下乐观锁和悲观锁?

悲观锁:悲观锁认为被它保护的数据是极其不安全的,一个事务拿到悲观锁之后,任何事务都不能对该数据进行修改,只能等锁的释放。数据库中的表锁,行锁,读锁,写锁都是悲观锁。

乐观锁:乐观锁认为数据的变动不会太频繁,所以不会上锁,但是会在事务提交之前判断在事务执行期间有没有其他事务对该数据进行改动。一般乐观锁都是由开发者实现,通常在表中添加一个版本或者时间戳,其中版本常用些,在事务从数据库中取数据时,会将其版本也取出,当事务要提交时将之前取出的版本和现在的版本对比,如果相等,则说明事务执行期间没有其他事务干扰,则提交事务,并将版本+1,以此来表明数据已变动,如果不相等就不允许事务提交,一般处理方法是重新操作。

177.mysql 问题排查都有哪些手段?

使用explain命令查询SQL语句。

开启慢查询日志,查看慢查询的SQL。

使用show processlist命令查看当前所有连接信息。

178.如何做 mysql 的性能优化?

为搜索字段创建索引。

开启慢查询日志,对慢SQL语句进行优化,例如:不使用select * ,效率极低;查询大量记录,使用limit分页。

选择适合的存储引擎。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值