Java八股文面试题之MySQL(一)

1.如何判断MySQL中的索引有没有生效 

在这里我提供了两种方法:

第一,使用EXPLAIN关键字来查看需要执行的这条sql语句,如果type列显示为const或eq_ref则代表使用了索引,如果type列显示为All,则代表没有使用索引。

第二,可以通过mysql慢查询日志来查看查询语句的执行时间,判断索引是否生效。如果查询语句的执行时间过长,则可能是因为没有使用索引导致的。

慢查询日志:是MySQL提供的一种日志记录,用于记录所有执行时间超过设定阈值的SQL语句,这个时间阈值在MySQL的配置文件中可以进行设置。慢查询日志中记录的内容包括查询语句、执行时间、哪个用户发出的查询、执行查询时所用到的索引等信息。

通过慢查询日志,我们可以了解到数据库中哪些查询语句执行时间较长,从而有针对性地对这些查询进行优化,以提高数据库的性能和响应速度。当系统出现性能问题时,检查慢查询日志也是一种非常有效的方法,可以帮助我们找到性能瓶颈。同时,在生产环境中,为了不影响SQL查询的性能,一般情况下不建议一直开启慢查询日志,可以在需要的时候针对性地开启,查看相应的结果,以便调整优化策略。

2.MySQL主从同步是如何实现的?

一般来说,Mysql的主从同步有以下五个步骤:

(1)当主库更新数据(包括update、insert和delete)时,这些操作会被写入到binlog中

(2)从库连接主库,向主库发起连接请求。

(3)当从库连接上主库时,主库会创建一个binlog dump线程,并将binlog中的操作内容发送到从库

(4)在从库上,会启动一个I/O线程,读取主库传过来的binlog内容,并将这些内容写入到relay log中

(5)在从库中也会创建一个sql线程,用于读取relay log中的内容,并执行相应的sql语句,将更新内容写入到从库的数据中,从而实现主从同步。

binlog是主库记录所有修改数据的日志文件

relay log是从库用来中转和存储主库binlog内容的文件

binlog dump是主库上用来向从库传递binlog内容的线程

I/O线程是从库上从主库读取binlog内容并写入到relay log的线程

3.谈谈MySQL的事务隔离级别 

(1)读未提交(Read Uncommitted):是最低的隔离级别。它允许事务读取其他会话未提交的修改,这样可能会导致脏读、不可重复读和幻读的问题。

(2)读已提交(Read Committed):表示一个事务只能看见已经提交事务所做的修改。但是,可能会在查询的过程中出现其他事务已经更新该行记录的情况,从而导致不可重复读的问题。

(3)可重复读(Repeatable Read):在同一事务内的查询都是事务开始时一致的,即使其他事务对数据进行了修改,这种隔离级别保证事务读取到的数据是一致的。在这种隔离级别下,可能出现幻读的问题,即在同一事务中,前一次查询的结果和后一次查询的结果不一致。

(4)序列化(Serializable):在这种隔离级别下,所有的事务依次执行,因此可以避免脏读、不可重复读和幻读的问题。但是,这种隔离级别性能开销大,很少被使用。在特殊场景下,比如需要反复读取同一个数据集的时候,可以考虑使用序列化隔离级别。

需要注意的是,隔离级别越高,事务的并发性越低,性能越差。

事务隔离级别,是为了解决多个并行事务竞争导致的数据安全问题的一种规范,多个事务竞争可能会产生三种不同的现象。

(1)脏读。假设有两个事务T1/T2同时在执行,T1事务有可能会读取到T2事务未提交的数据,但是未提交的事务T2可能会回滚,也就导致了T1事务读取到最终不一定存在的数据产生脏读的现象。

(2)不可重复读。假设有两个事务T1/T2同时执行,事务T1在不同的时刻读取同一行数据的时候结果可能不一样,从而导致不可重复读的问题。

(3)幻读。假设有两个事务T1/T2同时执行,事务T1执行范围查询或者范围修改的过程中,事务T2插入了一条属于事务T1范围内的数据并且提交了,这时候在事务T1查询发现多出来了一条数据,或者在T1事务发现这条数据没有被修改,看起来像是产生了幻觉,这种现象称为幻读。

4.SQl语句是如何执行的?

SQL语句的执行过程是由数据库管理系统(DBMS)来负责实现的,以下是SQL语句执行的大致过程:

  1. 数据库连接:应用程序通过数据库连接池向DBMS请求一个数据库连接。
  2. SQL解析:DBMS首先对SQL语句进行解析,检查语法、语义等错误。
  3. 查询优化:DBMS会对SQL进行优化,生成一个查询计划,选择最优的执行方式,考虑索引、表连接、子查询等多种因素,从而尽快地获取数据并返回结果。
  4. 数据访问:DBMS使用查询计划来访问数据库中的数据,并将数据缓存在内存中,以便更快的处理和响应数据请求。
  5. 数据返回:DBMS按照请求返回数据,可以是单行、多行,或是多个结果集。
  6. 断开连接:应用程序使用完连接后,将连接返回到数据库连接池中,断开与DBMS的连接。

其中,查询优化是执行效率的关键环节,也是DBMS所谓的核心技术之一,它需要对查询计划进行深入分析和优化,以确保查询结果的准确和高效。

5.MySQL的索引在哪些情况下会失效?

  1. 只对索引部分进行了操作:例如使用了字符串函数、类型转换等,导致MySQL无法使用索引,而只能进行全表扫描。
  2. 使用了NOT、<>或!=等逻辑操作符:这些操作符无法使用索引,需要进行全表扫描。
  3. 对索引列进行了NULL值判断:如果列包含NULL值,MySQL无法使用索引,只能进行全表扫描。
  4. 索引列类型不匹配:例如将字符串类型和数字类型进行比较,MySQL无法使用索引,只能进行全表扫描。
  5. LIKE操作出现通配符:在LIKE语句中使用通配符,会导致MySQL无法使用索引,而必须进行全表扫描。
  6. 对小表进行查询:对于小表,MySQL通常会认为全表扫描的代价更小,因此不使用索引。
  7. 在连接操作中使用了不同类型的列:在连接操作中,如果MySQL需要进行类型转换才能进行比较,会导致索引失效,必须进行全表扫描。
  8. 过多的索引:过多的索引可能会导致MySQL难以进行优化,从而降低性能。

6.MYSQL用什么关键字去重? 

DISTINCT  distinct

7.简单说一下MYSQL的左连接、右链接? 

左连接(LEFT JOIN)是指在连接两个表的同时,保留左表(也就是左连接的第一个表)中所有的记录,同时匹配右表中符合条件的记录。如果在右表中没有匹配到符合条件的记录,那么右表的那些字段将赋值为 NULL。

右连接(RIGHT JOIN)与左连接类似,只不过是保留右表(也就是右连接的第二个表)中的所有记录,同时匹配左表中符合条件的记录。如果在左表中没有匹配到符合条件的记录,那么左表的那些字段将赋值为 NULL。

总之,左连接和右连接的区别在于,一个保留左表中的记录,一个保留右表中的记录,同时也区别于结果集中 NULL 值的分布情况。 

8.数据库三范式是什么?

第一范式:列不可再分

第二范式:行可以唯一区分,主键约束(在一个关系表中,某一列或几列的值可以唯一的标识该表中每行记录)

第三范式: 表的非主属性不能依赖于其他表的非主属性,外键约束(某一列或几列的值必须与另一个关系表中的主键值相对应,用于建立两个关系表之间的联系)

三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立在第一第二范式上。

9.数据库的事务是什么?事务有哪些特点?

事务:多条sql语句,要么全部成功,要么全部失败。

特性:原子性、一致性、隔离性、持久性。

原子性:组成一个事务的多个数据库操作是一个整理,只有所有操作成功,才会提交事务。如果有任何一个操作失败,已经执行的任何操作都必须撤回,让数据库回到原始状态。

一致性:事务操作成功后,数据不会被破坏,例如A给B转账100元,不管操作是否成功,A和B的账户总额是不变的。

隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰。

持久性:一旦事务提交成功,事务中的所有操作必须持久化到数据库中。

10.索引是什么?有什么用? 

索引是一种数据库对象,用于帮助mysql提高查询效率。通俗的来说,索引就是字典的目录。

一般来说索引比较大,不能全部存储在内存中,因此索引往往是存在磁盘上的文件中。

11.sql语句常见优化手段? 

1.尽量避免使用select * 而是指定字段。

2.尽量减少子查询,使用左右内连接代替

3.or的查询尽量用union或union all代替

4.避免在where中使用!=或<>,否则可能导致数据库放弃索引

12.视图是什么?

视图是一种虚拟的表,主要作用是隐藏或限制访问表中的数据,提供一种安全的数据访问方式,也可以简化复杂的查询操作。

13.int(11)中的11代表了什么?

int(11)中的11,不影响字段存储的范围,只影响展示效果。 也就是说,代表了该整型字段可以展示的最大位数,不代表mysql会为该字段分配11个字节的空间,mysql还是会分配4个字节的存储空间,范围是-2^31~2^31-1

14.mysql索引有哪些类型?

主键索引:索引列中的值必须是唯一的,不允许有空值。

普通索引:mysql中的基本索引类型,没什么限制,允许在定义索引的列中查询重复值和空值。

唯一索引:索引列的值必须是唯一的,但是允许是null

全文索引:只能在文本类型char,varchar,text类型字段上创建。

15.什么时候不要用索引?

1.经常增删改查的列。因为每次修改操作时还需要更新索引

2.数据量较小表。数据较少,索引的效果十分有限,还会增加索引维护的成本

3.有大量重复数据的列。会浪费大量空间,也不会明显提高效率。

4.经常使用范围查询的列和经常使用排序和分组的列。索引只能加快等值查询或者部分等值查询的速度。

16.mysql有哪些锁?

1.共享锁:也叫作读锁,多个用户可以同一时刻读取同一个数据,相互之间没有影响。

2.排它锁:是一种写入操作加的锁,同一时刻只能有一个事务持有排它锁,其他事务不能持有排它锁或者共享锁(读锁和写锁),避免了并发问题。

3.表锁:直接锁定整张表

4.行锁:锁定需要操作的行,只能加在索引上

5.间隙锁:锁定一个范围而不是某一行 

17.什么是锁升级?

  •  事务在执行过程中,由于需要修改数据,需要先获取读锁,但在修改时需要升级成写锁。
  • 行锁只能被加在索引上,如果查询不走索引,自然就会升级成表锁。
  • 需要注意的是,锁升级的开销很大,会影响系统并发性能和系统响应速度。

18.谈谈悲观锁和乐观锁? 

  • 悲观锁的核心思想是“先拿到锁再进行操作”,悲观锁的常见实现方式有行锁、表锁、读写锁等,优点是能保持数据一致性,缺点是会严重影响性能。
  • 乐观锁的核心思想是“认为操作不会发生冲突”,在对数据进行操作之前不加锁,同时在操作完成之后校验本次操作是否有效,优点是能提高并发性能,缺点是并发变更比较频繁的时候,有较高的失败率。

19.主键和索引有什么区别?

  • 主键不允许null,而索引可以
  • 主键是用来唯一标识一条记录的,一张表只能有一个主键,可以有多个索引,并且主键的值必须是唯一的

20.存储MD5值应该用varchar还是char?

根据varchar和char的区别来看,md5是一个定长的值,应该使用char。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值