从一杯功夫茶聊到数据库索引
老周是我在汕头结识的茶友,在小公园附近开茶叶铺。他的凤凰单丛冲得极好,高冲低斟,每一泡的时间掐得比我的 setTimeout 还准。那天他问我:"你们写程序的,是不是跟泡茶差不多?"
索引就是茶罐的排列
老周的茶台上永远摆着三排茶罐——按香型分,再按年份排。他说你要找一罐 2023 年的蜜兰香,不用翻遍整个架子,直接走到"蜜兰香"那一排,手一伸就到。我说这不就是数据库索引吗?
回公司我就画了张图给他看:B+ 树的叶子节点就是你的茶罐排列——有序、分层、快速定位。如果没有索引,PostgreSQL 就要全表扫描,相当于把整个茶铺的罐子一个个打开闻。有索引,直接二分查找,O(log n)。老周听完若有所思:"那我这个叫 B+ 架。"
覆盖索引与熟客档案
功夫茶讲究"冲完即倒",每一泡都要倒干净。我告诉他,数据库里有"覆盖索引"的概念——如果查询的字段全在索引里,就不需要回表。就像你手边摆好了茶杯、茶壶、公道杯,不需要起身去拿。老周想了想:"那我铺子里的熟客档案就是覆盖索引——来了直接泡,不用问喝什么。"
慢即是快
老周泡一壶茶至少二十分钟,不急不躁。做技术有时候也需要这种节奏。一个复杂的 SQL 优化,可能花一个下午去理解执行计划、调整索引策略。写完只有三行改动,但背后的工夫就像冲茶——前几泡在唤醒茶叶,后面才是精华。
在汕头,代码和茶一样,都需要时间才能出味。