Dolt 的 go-mysql-server 五周年:一次 SQL 查询的旅程

2025-04-27
Dolt 的 go-mysql-server 五周年:一次 SQL 查询的旅程

本文回顾了 Dolt 数据库在采用 go-mysql-server 五周年之际,其 SQL 引擎的工作原理。文章详细阐述了从 SQL 查询解析到结果输出的整个过程,包括解析、绑定、计划简化、连接探索、计划成本计算和执行等步骤。Dolt 使用左递归解析器和自底向上的动态规划策略来优化查询计划,并利用代价模型选择最佳执行方案。文章还讨论了内存管理和未来的优化方向,例如统一中间表示和减少内存抖动。

阅读更多

Go语言内存分配的惊人陷阱:一个30%性能回归的故事

2025-04-21
Go语言内存分配的惊人陷阱:一个30%性能回归的故事

一个Go语言项目中,看似无害的代码重构导致性能下降30%。罪魁祸首是`ImmutableValue`结构体的`GetBytes`方法使用了值接收器,导致每次调用都进行一次堆分配,而堆分配比栈分配代价高得多。究其原因,是Go编译器的逃逸分析不够精确,未能识别出值接收器不会逃逸。最终,将值接收器改为指针接收器解决了问题。这个案例说明,理解Go编译器对内存分配的决策,以及使用合适的接收器类型,对于编写高性能Go代码至关重要。

阅读更多
开发

AI 代码编辑器 Cursor:10 倍生产力是幻想?

2025-03-29
AI 代码编辑器 Cursor:10 倍生产力是幻想?

一位 Dolt 数据库的开发者尝试使用 AI 代码编辑器 Cursor,亲身检验其是否能提升 10 倍的开发效率。起初,在大型代码库中使用 Cursor 让他倍感失望,调试过程异常繁琐。然而,在创建新项目时,Cursor 表现出色,几小时内就能完成一个 Factorio 模组。在工作中使用 Cursor 开发一个小工具时,它在生成基本功能代码方面表现良好,但代码质量有待提高,重构工作依然耗时。最终,作者认为 Cursor 提升了约 50% 的效率,远低于宣传的 10 倍,并指出其在处理复杂代码和理解现有代码库方面仍存在不足。

阅读更多
开发

深入解析 Go range 迭代器

2024-07-14
深入解析 Go range 迭代器

本文深入探讨了Go 1.23版本中引入的range迭代器,解释了其工作原理、三种类型以及如何使用yield函数控制循环。文章列举了使用range迭代器的多种场景,包括自定义集合类型的迭代、过滤值、处理错误和使用哨兵错误等。此外,文章还介绍了Pull和Pull2函数,可以将range迭代器转换为传统的迭代器。最后,文章讨论了使用range迭代器时需要注意的代码可读性和约定问题。

阅读更多
未分类 range

Go 泛型集合类型:缺失的文档

2024-06-28
Go 泛型集合类型:缺失的文档

本文介绍了在 Go 语言中编写泛型集合类型的经验,作者首先尝试了两种错误的实现方式,并分析了错误原因。最终,作者找到了正确的解决方案,即使用接口和类型约束来定义泛型集合类型,并详细解释了语法和注意事项。作者认为,尽管 Go 泛型功能强大,但相关文档缺乏对复杂用例的说明,导致开发者难以充分利用该特性。

阅读更多
未分类 集合

三种思考通道的方式

2024-06-26
三种思考通道的方式

本文介绍了 Golang 中通道的三种思考方式。首先,可以将通道视为带有锁保护访问的队列,发送者和接收者分别在队列的两端进行操作。其次,通道是 Go 并发生态系统中的基本组成部分,与goroutines、select 语句、定时器、等待组和错误组等协同工作以实现并发控制。最后,通道作为一种消息传递机制,通过在 goroutines 之间传递数据而不是共享内存来实现并发,这种方式更加安全和高效。

阅读更多
未分类 通道

160 位数字有多大?

2024-06-06
160 位数字有多大?

本文探讨了在数据库 Dolt 中使用 160 位加密校验和作为数据块地址的安全性。作者首先介绍了加密校验和的概念、碰撞阻力以及不同校验和算法的优缺点,然后详细比较了 2 的不同幂次方所代表的数据量,例如 2^64、2^80 等,并将其与现实世界中的事物如咖啡中的原子数、海洋中的原子数等进行类比,最终得出结论:160 位地址空间足以满足 Dolt 数据库的需求,碰撞概率极低。

阅读更多
未分类

Sentinel errors 和 errors.Is() 如何让 Go 代码性能降低 3000%

2024-05-31
Sentinel errors 和 errors.Is() 如何让 Go 代码性能降低 3000%

本文探讨了 Go 语言中不同错误处理策略的性能差异。作者通过基准测试发现,使用 sentinel errors 并结合 errors.Is() 的方式会使代码性能降低约 30 倍,远低于使用布尔值或直接错误比较的方式。文章分析了不同错误处理策略(如 Bool、ErrEqual、ErrorsIs、Panic 等)的性能表现,并指出 errors.Is() 在错误被包装的情况下性能损耗更为严重。作者建议开发者谨慎使用 sentinel errors,并在必要时先进行非空错误检查以减少性能损失。

阅读更多
未分类

如何在 24 小时或更短时间内修复错误

2024-05-17
如何在 24 小时或更短时间内修复错误

DoltHub 承诺在 24 小时内修复 Dolt 正确性错误。他们通过以下方式实现:迅速识别错误、确定优先级(区分错误和功能)、高质量的代码和测试、以及发布自动化。Dolt 有完善的规范和测试流程,能够快速识别和修复错误。发布自动化流程使客户能够快速获得修复程序。快速修复错误建立了客户对 Dolt 的信任,这对一个只有 5 年历史的开源 SQL 数据库至关重要。

阅读更多
未分类 Dolt 错误修复

Golang PGO builds using GitHub Actions | DoltHub Blog

2024-04-24
Golang PGO builds using GitHub Actions | DoltHub Blog

该网站提供了一个使用 GitHub Actions 构建 Go 项目的教程,包括设置、运行测试和部署到 Docker Hub 的步骤。它涵盖了使用 pgo 构建工具的详细说明,并提供了代码示例和故障排除建议。网站文章内容全面、技术准确,对 Go 开发人员和需要了解如何在 GitHub Actions 中构建 Go 项目的任何人都有帮助。

阅读更多
未分类