黑马Java热门面试题MySQL(五)


目录:

(1)MySQL 存储引擎对比

(2)索引的类型?

(3)为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树 呢?

(4)什么情况索引会失效?

(5)说一下 MySQL 的行锁和表锁?

(6)MySQL 问题排查都有哪些手段?

(7)MySQL 性能优化?

(8)优化 sql 语句?

(9)SQL 内连接外连接有什么差别?

(10)Msql 去重关键字?

(11)mysql 搜索引擎?

(12)百万数据怎么快速查询出一条数据?


(1)MySQL 存储引擎对比

(2)索引的类型?

• 从数据结构角度

1. 树索引 (O(log(n))) 2. Hash 索引

• 从物理存储角度 1. 聚集索引(clustered index) 2. 非聚集索引(non-clustered index)

• 从逻辑角度 1. 普通索引 2. 唯一索引 3. 主键索引 4. 联合索引 

(3)为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树 呢?

• B+ 树是基于 B 树和叶子节点顺序访问指针进行实现,它具有 B 树的平衡性, 并且通过顺序访问指针来提高区间查询的性能。

• 在 B+ 树中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右 相邻 key 分别是 key i 和 key i+1,且不为 null,则该指针指向节点的所有 key 大于等于 key i 且小于等于 key i+1。

• 进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然 后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节 点上进行二分查找,找出 key 所对应的 data。

• 插入、删除操作会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树 进行一个分裂、合并、旋转等操作来维护平衡性。 用 B+ 树不用 B 树考虑的是 IO 对性能的影响,B 树的每个节点都存储数据,而 B+ 树只有叶子节点才存储数据,所以查找相同数据量的情况下,B 树的高度更高, IO 更频繁。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部 加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。

(4)什么情况索引会失效?

 (5)说一下 MySQL 的行锁和表锁?

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

• 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最 高,并发量最低。 • 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并 发度最高。

 (6)MySQL 问题排查都有哪些手段?

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

• 使用 Explain 命令查询 SQL 语句执行计划;

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

(7)MySQL 性能优化?

 服务器优化(增加 CPU、内存、网络、更换高性能磁盘)

 表设计优化(字段长度控制、添加必要的索引)

 SQL 优化(避免 SQL 命中不到索引的情况)

 架构部署优化(一主多从集群部署)

 编码优化实现读写分离

(8)优化 sql 语句?

SQL 优化是一个分析,优化,再分析,再优化的过程。站在执行计划的角 度来说,我们这个过程,就是在不断的减少 rows 的数量。

1 查看表的执行频次,show 【session|global】 status; 如果是查询多,可以优化查询,如何增加和更新多可以优化更新.

2 查看 explain 执行计划来优化 基础的查询优化:

最大化利用索引;

尽可能避免全表扫描;

减少无效数据的查询;

1 使用联合索引要符合最左前缀法则.

2 范围查询 不要出现> =,<=  对于插入操作:要批量插入,主键顺序 插入,大批量插入数据还可以使用 load 指令

对于更新操作:更新的条件一定要有索引,要不然行锁会升级成表锁

 (9)SQL 内连接外连接有什么差别?

内连接:内连接 li(inner join)就是 join)利用 where 子句对多表连接形成的笛卡 尔积进行筛选。说白了内连接就是获取两个表之间的公共部分内容。

左外连接 left join:如果要获取左边表中的全部内容,就使用左连接

右连接 right join:如果要获取右边表的全部内容,就使用右连接。

(10)Msql 去重关键字?

1.作用于单列 select distinct name from A

2.作用于多列 select distinct name, id from A

3.COUNT 统计 select count(distinct name) from A;

(11)mysql 搜索引擎?

InnoDB:MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它 具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数 据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据 的完整性,InnoDB 还支持外键约束。

MyISAM:MyISAM 既不支持事务、也不支持外键、其优势是访问速度快,但是表级 别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的 数据场景。

Memory:在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory 类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用 HASH 索引,但是一旦服务关闭,表中的数据就会丢失

(12)百万数据怎么快速查询出一条数据?

方法 1: 直接使用数据库提供的 SQL 语句 MySQL 中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N

方法 2: 建立主键或唯一索引, 利用索引(假设每页 10 条)

方法 3: 基于索引再排序 以上方法需要 limit 分页,mysql 大数据量使用 limit 分页,随着页码的增大,查询 效率越低下。后续需要对 limit 分页问题的性能优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喵俺第一专栏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值