JAVA面试八股文一(mysql)

文章讲述了B-Tree和B+Tree的区别,包括它们的共同点和B+Tree的额外特性。讨论了MySQL中设置索引但无法使用的场景以及索引的基本原理和设计原则。此外,还涉及了数据库优化,如SQL慢查询的分析和处理,以及分库分表的策略和执行流程。最后,提到了事务的特性、隔离级别以及InnoDB引擎对主键的要求。
  1. B-Tree和B+Tree区别

共同点;一个节点可以有多个元素, 排好序的

不同点:B+Tree叶子节点之间有指针,非叶子节点之间的数据都冗余了一份在叶子节点

B+Tree是B-Tree 的升级

  1. mysql什么情况设置了索引,但无法使用

a.没符合最左原则

b.字段进行了隐式数据转化

c.走索引没有全表扫描效率高

  1. 索引的基本原理

把无序的数据变成有序的查询

a.把创建了索引的列的内容进行排序

b.把排序结果生成倒排表

c.在倒排表上拼上数据地址链

d.查询的时候先拿倒排表内容没在取数数据链,从而拿到具体数据

  1. 索引设计原则

a.适合索引的列出现在where中的列,或连表查询的指定列

b.基数较小的表,索引效果比较差,没必要建索引

c.辨识度不高的字段没必要

d.字节长度过大的字段没必要

  1. sql慢查询优化

a.分析sql语句是否加载了额外的数据

b.explain 分析执行计划,修改语句修改索引

d.数据量是否太大,如果太大 横向,纵向分表

  1. mysql如何分库分表,分库分表的方式和分片策略有哪些,分库分表后,sql语句执行流程

什么是分库分表:当表中的数据量过大,整个查询效率就会降低的非常明显。为了提升效率,就要将整个表的数据分散到多个数据库的多个表中

分库分表的策略:

垂直分片:

从业务和数据需求上,将不同的数据表分散到不同的数据库。能解决数据库文件过大的问题,但是从根本上解决不了数据大查询慢的问题。

水平分片:

将表的数据拆分放到不同的数据库和表中,可以解决数据量过大造成的查询效率过低的问题。

水平分片策略:

取余,取模:优点:数据平均,缺点:扩容非常麻烦

按照范围分片:比较好扩容,数据分布不均匀

按照时间分片:比较容易将热点数据区分出来

按枚举分片:例如按地区

多大数据量适合分库分表:数据超过500w或文件大于2G

分库分表常用组件:Mycat\ShardingSphere

分库分表后,SQL执行流程:

sql解析》查询优化》sql路由》sql改写》sql执行》结果归并

  1. 什么是脏读,幻读,不可重复读?要怎么处理

脏读:在事务进行过程中,读取到了其他事务未提交的数据。

不可重复读:在事务执行过程中,多次查询的数据不一致

幻读:在一个事务中,用同样的操作查询数据,得到的记录数不一致。

处理方式有很多种:加锁,事务隔离,mvcc

加锁:

  1. 脏读:在修改时加排它锁,直到事务提交才释放。读取时加共享锁,读完释放锁。

  1. 不可重复读:读书数据时,加共享锁,写数据时加排它锁。

  1. 幻读:加范围锁

  1. 事务的基本特性和隔离级别

基本特性:

  1. 原子性:指一个事务的操作要么全部成功,要么全部失败。

  1. 一致性:数据苦总是从一个一致性的状态转换到另一个一致性的状态。

  1. 隔离性:事务的修改在最终提交前,对其他事务是不可见的

  1. 持久性:一旦事务提交,所有的修改会永久保存到数据库中

隔离性的4个隔离级别:

  1. 读未提交 可能会读到其他事务未提交的数据,也叫脏读

  1. 读已提交 两次读取结果不一致,叫不可重复读

  1. 可重复读 mysql默认级别,就是每次读取结果一样,可能产生幻读

  1. 串行 一般不会使用,他会给每一行读取的数据加锁,会导致大量超时和锁竞争问题。

  1. MYLKAM引擎和InnoDB的区别

MYLKAM有三个文件,表结构文件,索引文件,数据文件。叶子节点data值 指向数据文件对应行数据

InnoDB有两个文件 表结构文件, 索引和数据在一起的文件。叶子节点包含完整的数据

  1. 为什么InnoDB引擎必须有主键,并且推荐使用整型自增

默认会创建一个rowId。 不推荐使用uuid作为主键,不支持范围查询

B+数底层搜索的时候可能会发生值比较。

  1. mysql优化

检查日志输出定位查询时间超过一定时间的sql

EXPLAN检查索引是否生效,全部扫描

  1. EXPLAN使用

type:

all = 将全表扫描

index=全表扫描与All的区别,index只遍历索引树

rang=只检测给定的范围行,使用一个索引来选择行

ref = 使用普通索引

eq_ref = 将主间索引作为索引

最优:const,system 不需要优化

### Java面试中关于MySQL的高频问题及解答 #### 1. MySQL索引的工作原理是什么? MySQL索引是种用于快速查找表中特定记录的数据结构。最常用的索引类型是B+树索引,它具有良好的查询性能和插入删除效率。当创建索引时,MySQL会按照指定列的值构建棵B+树,并将数据页指针存储在叶子节点上[^1]。 对于复合索引(Composite Index),需要注意“最左前缀原则”,即只有查询条件包含了索引定义中最左边的部分或全部字段时,才能利用该索引加速查询[^2]。 ```sql CREATE INDEX idx_name ON table_name(column1, column2); EXPLAIN SELECT * FROM table_name WHERE column1 = 'value' AND column2 = 'value'; ``` --- #### 2. 如何优化MySQL查询性能? 优化MySQL查询可以从以下几个方面入手: - **合理使用索引**:为经常作为过滤条件的列建立合适的索引。 - **避免全表扫描**:确保WHERE子句中的列已建有索引。 - **减少不必要的JOIN操作**:过多的JOIN可能导致笛卡尔积膨胀,影响执行计划。 - **分析慢查询日志**:启用`slow_query_log`功能定位耗时较长的SQL语句并针对性改进。 示例代码如下: ```sql SET GLOBAL slow_query_log = 'ON'; SHOW VARIABLES LIKE 'slow_query_log_file'; SELECT SQL_NO_CACHE ...; -- 测试单条SQL的实际运行时间 ``` --- #### 3. 数据库事务隔离级别有哪些?分别解决什么问题? MySQL支持四种标准的事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)以及串行化(Serializable)。不同级别的主要区别在于它们对脏读、不可重复读和幻读现象的支持程度[^4]。 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | |------------------|------|------------|-------| | READ UNCOMMITTED | 是 | 是 | 是 | | READ COMMITTED | 否 | 是 | 是 | | REPEATABLE READ | 否 | 否 | 是 | | SERIALIZABLE | 否 | 否 | 否 | 默认情况下,InnoDB引擎采用的是REPEATABLE READ模式,在此设置下可以有效防止大部分并发异常情况的发生。 --- #### 4. 分布式环境下的MySQL如何保证数据致性? 在分布式系统中维护致性的方法主要包括两阶段提交协议(2PC)、补偿事务(TCC)以及基于消息队列的消息最终致性方案(MQ)。其中,2PC虽然简单易懂但存在单点故障风险;而TCC则更加灵活可控,适合复杂业务逻辑场景;至于后者,则依赖于可靠的消息传递机制达成跨服务间的状态同步目标。 具体实现细节需视乎具体的项目需求和技术栈选择而定。 --- #### 5. 常见的分库分表策略及其适用范围? 随着数据量的增长,单实例难以满足高性能访问的要求,此时就需要考虑水平拆分技术——即将张大表分割成若干个小表分布在不同的物理设备之上。常见的分区依据包括但不限于日期维度、地域属性或者用户ID哈希值等等。 例如按月份保存订单信息: ```sql CREATE TABLE orders_YYYYMM ( id BIGINT NOT NULL AUTO_INCREMENT, order_date DATE NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; ``` 这种做法的好处是可以显著降低每次查询所需遍历的数据规模从而提升响应速度;然而同时也带来了诸如联合统计报表变得困难等问题需要额外处理。 --- ### 总结 上述内容概括了几类典型的围绕着关系型数据库管理系统展开的技术考察方向,既涉及基础理论层面的知识点巩固又兼顾到了工程实践当中遇到的真实难题探讨。希望这些资料能对你即将到来的职业发展之路有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值