HNSW:为什么这个图算法正在统治AI时代的向量检索

2016年3月,Yury Malkov和Dmitry Yashunin在arXiv上发表了一篇题为《Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs》的论文。这篇论文提出的HNSW算法,在随后的几年里成为了几乎所有主流向量数据库的核心索引——Elasticsearch、Milvus、Pinecone、Weaviate、Qdrant无一例外。 ...

13 min · 6304 words

数据库查询引擎为何跑不过手写代码?从火山模型到编译执行的三十年突围

2008年,一位数据库研究员做了一个简单的实验:他用C++手写了一段处理TPC-H Query 1的代码,然后与当时最先进的数据库系统对比性能。结果令人震惊——手写代码比数据库快了整整一个数量级。这个结果刺痛了数据库社区:为什么精心设计的查询引擎,竟然输给了几行手写的循环? ...

9 min · 4500 words

Roaring Bitmaps:为什么这种压缩位图正在重塑大数据分析的存储范式

2014年,Daniel Lemire和Samy Chambi等人在arXiv上发表了一篇题为《Better bitmap performance with Roaring bitmaps》的论文。论文的核心结论令人印象深刻:相比当时主流的压缩位图方案WAH和Concise,Roaring bitmaps在交集操作上快了最多900倍,同时压缩率还提高了约2倍。这不是学术界的理论推演,而是基于真实数据集的实测结果。 ...

12 min · 5685 words

为什么主流语言的sort函数都选择了Timsort

1959年,Tony Hoare发明了快速排序。这个算法在教科书中被奉为圭臬,平均时间复杂度$O(n \log n)$,原地排序,缓存友好,几乎完美。然而,六十多年后的今天,当你调用Python的list.sort()、Java的Arrays.sort()或Rust的稳定排序时,底层运行的却是一个叫Timsort的算法。 ...

10 min · 4652 words

Spring事务的七种传播行为为何让无数开发者踩坑:从REQUIRED到NESTED的设计哲学与实现原理

某电商系统在大促期间出现了一个诡异的问题:订单创建失败后,审计日志也没有记录。开发者明明在catch块里调用了审计服务的save方法,为什么数据还是消失了?排查日志后发现了这行异常: ...

12 min · 5717 words

线程池的七个参数为何让无数开发者踩坑从execute流程到ctl的设计哲学

线程创建从来不是免费的。在Java中,每个线程都会分配一个独立的调用栈(默认1MB),线程的创建和销毁需要操作系统参与,涉及系统调用和内存分配。当线程数量达到数千时,这种开销会显著影响系统性能。正是这一根本问题催生了线程池的设计——通过线程复用减少创建销毁的开销。2004年,随着JSR 166的正式发布,Java 5引入了java.util.concurrent包,ThreadPoolExecutor成为这个包中最核心的组件之一。 ...

12 min · 5848 words

ConcurrentHashMap的十五年演进:从分段锁到CAS如何重塑Java并发基石

2003年,Doug Lea向JCP提交了JSR-166规范提案,试图为Java引入一套标准化的并发工具库。在此之前,Java开发者面对并发场景时只能在synchronized、Hashtable和Collections.synchronizedMap之间做出选择——它们要么过于粗粒度,要么性能堪忧。ConcurrentHashMap作为这套工具库的核心组件之一,其设计理念影响了此后二十年Java并发编程的范式。 ...

12 min · 5720 words