面试数据库八股文十问十答第五期
作者:程序员小白条,个人博客
1)介绍一下 MySQL8 的新特性
- Window Functions: 提供了对查询结果进行窗口化处理的功能,例如使用
ROW_NUMBER()
进行分页。 - Common Table Expressions (CTE): 支持 WITH 语法,允许在查询中使用带有别名的临时结果集。
- JSON enhancements: 支持 JSON 聚合函数、更多的 JSON 操作符和 JSON 路径表达式。
- Spatial Reference System: 引入了空间参考系统,以支持地理空间数据类型。
- Invisible Indexes: 允许创建不会影响查询计划的不可见索引,有助于在不影响性能的情况下测试新的索引。
- Resource Groups: 允许将用户分组,并为每个组分配特定的资源。
- MySQL Document Store: 将 MySQL 与 NoSQL 功能相结合,支持以 JSON 格式存储和查询文档数据。
2)MySQL 的索引有几种类型?
- B-Tree 索引: 默认的索引类型,适用于等值查询和范围查询。
- 哈希索引: 适用于精确查找,不支持范围查询,通常用于内存表。
- 全文索引: 用于全文搜索,例如
FULLTEXT
索引。 - 空间索引: 用于处理空间数据,例如地理空间数据类型的
SPATIAL
索引。
3)MySQL 中的默认索引是什么?
在 MySQL 中,主键列(Primary Key)和唯一约束列(Unique Key)会默认创建 B-Tree 索引,以保证数据的唯一性和快速检索。
4)MySQL 中有哪些锁?
- 共享锁(Shared Lock): 多个事务可以同时持有共享锁,用于读操作,不阻塞其他事务的共享锁。
- 排他锁(Exclusive Lock): 事务独占资源的锁,用于写操作,会阻塞其他事务的任何锁。
5)MySQL 中什么时候使用表锁,什么时候使用行锁?
- 表锁(Table Lock): 适用于大批量的数据操作,如表结构变更,全表查询等。表锁对并发性影响较大,因为它会锁住整个表,其他事务无法同时操作。
- 行锁(Row Lock): 适用于只涉及少量数据的操作,如更新或删除单行记录。行锁对并发性的影响较小,因为只锁住需要操作的行,其他事务仍可以同时操作其他行。
选择使用表锁还是行锁取决于具体的业务需求和并发访问模式。表锁可能导致性能瓶颈,因此在高并发环境下更倾向于使用行锁。
6)介绍MySQL中锁、索引、事务之间的联系
- 锁: MySQL中的锁机制用于控制对数据的访问,以确保并发事务之间的数据一致性。锁可以是共享锁或排他锁,用于控制读写操作的并发性。
- 索引: 索引是一种数据结构,用于加速对数据库表中数据的检索。通过使用索引,可以降低查询的时间复杂度,提高数据库的性能。
- 事务: 事务是一系列数据库操作的单元,要么全部执行成功,要么全部回滚。事务的隔离性和一致性要求使用锁来确保事务的执行不受并发操作的影响。
在并发操作中,锁用于控制事务对数据的访问,而索引用于加速对数据的检索。事务通过锁来保证数据的一致性和隔离性,而索引可以减少锁的竞争,提高并发性能。
7)MySQL的架构讲一下?
MySQL的架构主要包括以下组件:
- 连接池和线程处理: 处理客户端连接请求,并使用线程池进行管理。
- 查询解析和优化器: 解析SQL查询语句,生成查询计划,进行优化以提高执行效率。
- 存储引擎: 负责实际的数据存储和检索工作。MySQL支持多种存储引擎,如InnoDB、MyISAM等。
- 缓存和缓存管理: 使用缓存来提高数据的访问速度,通过缓存管理来优化内存的使用。
- 日志记录: 记录数据库的操作日志,包括事务日志和错误日志,以确保数据的一致性和可靠性。
- 连接管理和安全性: 管理用户连接,并提供安全机制,包括用户认证和权限管理。
8)MySQL怎么去实现分布式锁呢?
- 基于表的实现: 创建一个专门用于存储锁信息的表,通过插入、更新、删除记录来控制分布式锁。
- 基于缓存的实现: 使用分布式缓存工具如Redis,利用其原子性操作来实现分布式锁。
- 基于ZooKeeper等协调服务: 利用分布式协调服务实现分布式锁,通过在协调服务中创建临时节点来控制锁的释放与获取。
9)介绍一下b+树的数据结构
- B+树是一种自平衡树,用于索引结构。它与B树相似,但在叶子节点上存储了所有的关键字,且叶子节点之间使用链表相连。
- 所有关键字按顺序存储在叶子节点上,内部节点只存储索引,而不存储实际的关键字数据。
- B+树的特点包括有序性、高度平衡、适合范围查询等。在数据库中常被用作索引结构。
10)(a,b,c)联合索引 where a = ‘xxx’ b is null c = 'xxx’怎么走索引
- 对于这个联合索引 (a, b, c),在查询条件中使用了a和c,而b为NULL,MySQL可以利用这个联合索引进行范围查询。
- 索引的有序性可以让数据库快速定位到 a=‘xxx’ 的记录,然后在该记录的基础上进行 c=‘xxx’ 的过滤,由于b是NULL,不会影响索引的使用。
- 总体来说,这个查询条件可以有效地利用联合索引,提高查询性能。但要注意,实际的性能还受到表的大小、数据分布等因素的影响。