22道Mysql面试真题和答案

本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。

1.请介绍下联合索引的最左匹配原则

  • 建立一个联合索引(a,b,c),相当于建立多个索引(a)(a,b)(a,b,c)
  • 索引排序是从左到右匹配的,即索引查找顺序为 a -> b -> c
  • 如果直接查询b,则不符合最左原则,会直接遍历查询所有节点

联合索引的优点

  • 减少索引树的个数,减小空间开销
  • 提高索引查询效率

2.什么叫回表查询

        索引分为聚集索引和普通索引,聚集索引的叶子节点是行记录信息,普通索引的叶子节点是索引字段值。

        普通索引搜索到叶子节点,获取到索引字段值,需要回到聚集索引树,找到对应的行记录,这个过程叫回表查询

3.普通索引和唯一索引的区别?

  • 对于查询操作,两者都是从索引树查询,没有区别
  • 对于更新操作,唯一索引需要先将加载到内存,判断是否有冲突,性能比普通索引差

4.聚集索引和非聚集索引的区别?

定义

  • 聚集索引:聚集索引的逻辑顺序决定了存储的物理顺序,
  • 非聚集索:非聚集索引的逻辑顺序不对应存储的物理顺序

区别

 1.使用场景

  • 聚集索引:适用于经常搜索范围值的场景
  • 非聚集索引:适用于频繁删除和修改的场景

 2.叶子节点区别

  • 聚集索引:叶子节点是数据节点
  • 非聚集索引:叶子节点不是数据节点,是指向数据块的指针

5.JDBC访问数据库的基本步骤是什么

        加载驱动 -> 通过DriverManager获取连接connection -> 通过连接创建会话 -> 通过会话进行数据的增删改查 -> 关闭资源。

6.说说事务的概念,在JDBC编程中处理事务的步骤

6.1 什么是事务

        作为一个工作单元执行的一系列数据库操作。

6.2 事务的特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

7.数据库连接池的原理,为什么要使用连接池

7.1 原理

        数据库连接池的基本思想就是为数据库建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕再放回去。

7.2 使用连接池的原因

  • 可以设置连接池最大连接数量来防止系统与数据库无止境的连接;
  • 可以通过连接池监控数据库的连接数量、使用情况;
  • 避免了反复地创建和销毁数据库连接,提高了访问效率。

8.说一下 MySQL 执行一条查询语句的内部执行过程?

  1. 通过连接器连接到mysql服务器
  2. 查看缓存,有则返回
  3. 分析器进行语法分析
  4. 优化器对查询语句进行优化
  5. 执行器进行查询

9.一张自增表中有三条数据,删除两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?

  • 如果数据库引擎是InnoDB,则ID为2
  • 如果数据库引擎是MyISAM,则ID为4

原因:InnoDB将自增最大ID放在内存,重启后内存内容丢失;MyISAM将自增最大ID放在数据文件,重启不会造成自增ID丢失

10.MySQL 是如何处理死锁?

  1. 通过 innodb_lock_wait_timeout 来设置超时时间,一直等待直到超时
  2. 发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其他事务继续执行。

11.MySQL的四种事务隔离级别

12.数据库的DDL和DML的用法和区别?

定义

  1. DDL是数据定义语言,专门对表、数据库进行定义,如create、alter、drop、truncate等都会直接影响到表结构
  2. DML是数据操纵语言,如delete、insert、select等操作,只会影响表数据内容,不会影响结构

区别

 DML需要手动开启和提交事务,可以回滚;DDL是隐性提交的,不能回滚        

13.preparedStatement和Statement的区别

        preparedStatement继承于Statement,具有Statement的所有方法,同时它还添加了一系列方法来提高执行效率和安全性。

preparedStatement效率比Statement高

        在需要多次使用同一个SQL语句时,使用preparedStatement效率高,因为preparedStatement运行前经过了预编译。

preparedStatement安全性更高

        在有参数输入的情况下,preparedStatement使用占位符“?”来代替,在每次执行该语句时,使用相关set方法写入参数,防止了SQL注入攻击。

14.存储引擎 InnoDB 和 MyISAM 有什么区别?

  • 事务:InnoDB支持事务,MyISAM不支持事务
  • 锁粒度:InnoDB支持行级锁,MyISAM不支持行级锁,只支持表锁
  • 外键:InnoDB支持外键,MyISAM不支持外键
  • 查询:InnoDB主键查询性能高于MyISAM

15.什么是独立表空间和共享表空间?它们的区别是什么?

  • 共享表空间:数据库的所有表数据、索引文件都存放在一个文件中,一个表删除了空间不会清除
  • 独立表空间:每一个表都存储在不同的文件中,表删除会清除空间

16.把一个 InnoDB 表的主键删掉,是不是就没有主键,就没办法进行回表查询了?

        不是,如果删掉了主键,InnoDB会自己添加一个长度为6字节的rowId作为主键

17.MySQL查询缓存的优缺点

        优点:如果查询缓存有需要的数据,会直接返回,提高查询效率

        缺点:查询缓存频繁失效,任何更新表的操作都会造成缓存失效,缓存命中率降低

18.JDBC的ResultSet是什么?

        在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。

19.Mysql如何进行sql分页查询?

语法:
select * from tableName where 条件 limit 每页大小 offset 起始行下标

示例:
select * from answer limit 3 OFFSET 1

20.JDBC的DriverManager是用来做什么的?

        JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

21.什么是幻读,哪种隔离级别可以防止幻读?

        幻读是指一个事务多次执行一条查询返回的却是不同的值。SERIALIZABLE(锁表)隔离级别才能防止产生幻读。

22.什么是脏读?哪种数据库隔离级别能防止脏读?

        脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

        以下隔离级别可以防止脏读

  1. READ_COMMITTED(锁定正在读取的行)
  2. REPEATABLE_READ(锁定所读取的所有行)
  3. SERIALIZABLE(锁表)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空是梦想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值