本专栏记录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 执行一条查询语句的内部执行过程?
- 通过连接器连接到mysql服务器
- 查看缓存,有则返回
- 分析器进行语法分析
- 优化器对查询语句进行优化
- 执行器进行查询
9.一张自增表中有三条数据,删除两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?
- 如果数据库引擎是InnoDB,则ID为2
- 如果数据库引擎是MyISAM,则ID为4
原因:InnoDB将自增最大ID放在内存,重启后内存内容丢失;MyISAM将自增最大ID放在数据文件,重启不会造成自增ID丢失
10.MySQL 是如何处理死锁?
- 通过 innodb_lock_wait_timeout 来设置超时时间,一直等待直到超时
- 发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其他事务继续执行。
11.MySQL的四种事务隔离级别
12.数据库的DDL和DML的用法和区别?
定义
- DDL是数据定义语言,专门对表、数据库进行定义,如create、alter、drop、truncate等都会直接影响到表结构
- 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.什么是脏读?哪种数据库隔离级别能防止脏读?
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
以下隔离级别可以防止脏读
- READ_COMMITTED(锁定正在读取的行)
- REPEATABLE_READ(锁定所读取的所有行)
- SERIALIZABLE(锁表)