MySQL的索引类型包括B+树、聚簇索引、非聚簇索引、哈希索引和空间索引。
B+树索引常用于单列、组合索引以及全文检索。
其中聚簇索引将数据存储在叶子节点,非聚簇索引通过主键指针查找数据。
组合索引遵循最左前缀原则。B树与B+树的区别在于数据存储结构,B+树只在叶子节点存储数据,适合范围查找。
MySQL中InnoDB引擎使用聚簇索引,MyISAM则使用非聚簇索引,数据存储和索引结构不同。
MySQL 分为三层结构:
- 客户端层 处理网络连接和授权认证
- 服务层负责查询解析、优化、缓存以及存储过程、视图等
- 存储层用于数据存储和引擎的交互
存储引擎层和文件系统交互,支持插件式引擎,如 MyISAM 和 InnoDB。
查询时,MySQL先进行 SQL 解析,再由优化器选择执行路径,最后通过存储引擎获取数据,结果返回客户端并可能缓存。
MVCC(多版本并发控制)是数据库系统中的一种乐观并发控制方式,通过可见性算法实现高效的并发访问。
MVCC的两种读形式包括快照读(无需加锁,读取当前事务可见版本)和当前读(读取最新版本,涉及增删改操作)。
MVCC通过隐藏字段(如RowID、事务ID、回滚指针)和undo log(记录事务操作的日志)来实现。
可见性算法通过比较事务ID和系统活跃事务列表判断数据对当前事务的可见性,从而避免了锁的使用带来的性能问题。
Redis 使用五种数据类型:String、List、Hash、Set、ZSet
每个类型都有不同的底层实现以提高内存效率和性能String 类型支持整数、短字符串(embstr)和长字符串(raw)存储
List 类型使用 quicklist 结构,结合了双向链表和压缩列表(listpack)
Hash 类型根据数据量使用 ziplist/listpack 或 hashtable 存储
Redis 通过这些结构优化了内存占用和查询效率,适合缓存、计数器、分布式锁等场景
Redis 使用单线程 Reactor 模型处理命令,主要通过主线程完成客户端请求的接收、解析、数据操作和响应发送。
6.0 版本之前,Redis 仅使用单线程处理所有任务,而 6.0 后引入了多线程来处理 I/O 操作,提升了网络性能。
多线程仅用于网络 I/O,如数据的读取和写入,核心的命令执行仍由单线程完成,确保数据操作的安全性与一致性。
这种改进提高了 Redis 的吞吐能力,特别适合高并发场景。
Go语言的map底层是哈希表,通过哈希函数将键映射到对应的bucket中。
map的扩容通常在两个场景下触发:装载因子超过6.5和溢出bucket数量过多。
扩容时,bucket数量翻倍,旧数据逐步迁移到新bucket。
哈希表使用链表法解决哈希冲突,通过key的哈希值低位确定所属bucket,哈希值高位用于桶内定位key。
扩容过程中,新bucket的元素被重新分配,查找操作时优先查询新bucket,并逐步迁移旧数据。
早期操作系统为单进程架构,进程串行执行,造成低效。
多进程/线程操作系统改进了并发能力,但带来高内存占用和调度开销问题。
Go语言引入了轻量级的Goroutine,一个goroutine仅占几KB内存,并由用户态调度协作式执行。
Go采用GMP模型:G代表goroutine,M代表线程,P代表调度器。
P的数量与CPU核数匹配,通过全局队列、局部队列和偷取机制调度goroutine,减少调度开销,实现高效并发。
Elasticsearch(ES)的核心原理包括搜索引擎的工作机制、倒排索引、索引的创建和更新、并发控制等
搜索引擎通过查询分析、分词、关键词匹配和搜索排序完成一次检索
倒排索引将关键词与文档建立映射关系,实现高效搜索
ES的索引具有不变性,通过创建新段(Segment)更新数据并发控制中,ES主要使用乐观锁机制确保一致性
ES写入流程包括写入内存、磁盘和提交操作,结合translog日志文件保障数据的持久性
Elasticsearch (ES) 是一种分布式搜索引擎,具备去中心化架构和分布式集群特性。
ES 通过动态选举主节点来避免单点故障。
集群中的每个节点负责不同任务,包括主节点、数据节点、协调节点等。
数据通过分片和副本机制进行分布式存储和高可用性保证。主分片处理写操作,副本分片提供数据冗余和读操作支持。
ES 采用路由机制根据文档的 ID 选择目标分片,并且能够通过水平扩容和故障转移保证系统性能和可靠性