数据库索引介绍
索引
哈希索引
保留一个内存中的哈希映射,其中每个键都映射到一个数据文件中的字节偏移量,查找一个值时,使用哈希映射来查找数据文件中的偏移量,寻找(seek) 该位置并读取该值。
局限性:散列表必须能放进内存;范围查询效率不高
SSTables
排序字符串表(Sorted String Table),要求键值对的序列按键排序,查询时不再需要将所有的键保存在索引,只需存很稀疏的键就够了。写入操作:在磁盘上维护有序结构没有内存简单,内存中有很多树形数据结构,例如红黑树或AVL树。写入时将数据写入内存的树结构中,当内存表大于某个阈值时,将其作为SSTable文件写入磁盘。查询操作:先尝试在内存表中找到关键字,然后在最近的磁盘段中,然后在下一个较旧的段中找到该关键字。
问题:数据库崩溃时,写入内存的数据会丢失,可以通过记录写日志的方式解决(日志在内存表持久化后丢弃)。
B树
B树同样保持按键排序的键值对,B树将数据库分解成固定大小的块或页面,传统上大小为4KB(有时会更大),并且一次只能读取或写入一个页面。每个页面都可以使用地址或位置来标识,一个页面引用另一个页面地址。
写入操作:如果要更新B树中现有键的值,则搜索包含该键的叶页,更改该页中的值,并将该页写回到磁盘(对该页的任何引用保持有效) 。如果你想添加一个新的键,你需要找到其范围包含新键的页面,并将其添加到该页面。如果页面中没有足够的可用空间容纳新键,则将其分成两个半满页面,并更新父页面以解释键范围的新分区。
聚集索引
从索引到堆文件的额外跳跃对读取来说性能损失太大,因此可能希望将索引行直接存储在索引中。在MySQL的InnoDB存储引擎中,表的主键总是一个聚集索引,二级索引则引用主键,Myisam引擎中是非聚集索引,数据存储在堆文件中而非叶子结点。
在内存中存储一切
随着RAM变得更便宜,将数据全部保存在内存中是非常可行的。通过消除与管理磁盘上的数据结构相关的所有开销,内存数据库可以提供巨大的性能改进,如VoltDB,MemSQL。反直觉的是,内存数据库的性能优势并不是因为它们不需要从磁盘读取的事实。即使是基于磁盘的存储引擎也可能永远不需要从磁盘读取,因为操作系统在内存中缓存了最近使用的磁盘块。相反,它们更快的原因在于省去了将内存数据结构编码为磁盘数据结构的开销。除了性能,内存数据库的另一个有趣的领域是提供难以用基于磁盘的索引实现的数据模型。例如,Redis为各种数据结构(如优先级队列和集合)提供了类似数据库的接口。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章