[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-23-xingneng-diaoshi-shujuku-duqu-yanchi":3},{"article":4,"author":55},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":35,"related_articles":36},"d3000000-0000-0000-0000-000000000123","a0000000-0000-0000-0000-000000000036","Deep EVM #23：性能调试——当数据库读取扼杀你的延迟","deep-evm-23-xingneng-diaoshi-shujuku-duqu-yanchi","深度剖析Rust系统中的数据库读放大问题。使用MDBX\u002FRocksDB的真实案例研究，展示O(N) vs O(affected)优化和CacheDB模式。","## 问题：不可见的延迟\n\n你的Rust系统运行良好——直到某天延迟突然飙升。分析器显示瓶颈在数据库读取。但为什么？\n\n## 读放大\n\n读放大是指一次逻辑读取触发多次物理读取。在LSM树数据库（RocksDB、MDBX）中，查找一个键可能需要搜索多个层级。\n\n## 真实案例\n\n在MEV机器人中，每次模拟需要读取数十个存储槽。初始实现在每次模拟时直接查询数据库：\n\n```rust\n\u002F\u002F O(N) - 每次模拟读取所有需要的槽\nfor slot in required_slots {\n    let value = db.get(slot)?;  \u002F\u002F 每次都是数据库查询\n}\n```\n\n## CacheDB优化\n\n使用CacheDB模式——在第一次读取后缓存值，后续读取命中缓存：\n\n```rust\nstruct CacheDB\u003CDB> {\n    inner: DB,\n    cache: HashMap\u003CStorageKey, StorageValue>,\n}\n\nimpl\u003CDB: Database> Database for CacheDB\u003CDB> {\n    fn get(&mut self, key: &StorageKey) -> Result\u003CStorageValue> {\n        if let Some(value) = self.cache.get(key) {\n            return Ok(value.clone());  \u002F\u002F O(1) 缓存命中\n        }\n        let value = self.inner.get(key)?;  \u002F\u002F 数据库查询\n        self.cache.insert(key.clone(), value.clone());\n        Ok(value)\n    }\n}\n```\n\n## O(N) vs O(affected)\n\n关键优化是从O(N)（每次模拟读取所有槽）变为O(affected)（只读取自上次以来变化的槽）。\n\n## 总结\n\n数据库读放大是高性能系统中的隐形杀手。CacheDB模式和增量更新策略可以将延迟从毫秒降低到微秒级。","\u003Ch2 id=\"\">问题：不可见的延迟\u003C\u002Fh2>\n\u003Cp>你的Rust系统运行良好——直到某天延迟突然飙升。分析器显示瓶颈在数据库读取。但为什么？\u003C\u002Fp>\n\u003Ch2 id=\"\">读放大\u003C\u002Fh2>\n\u003Cp>读放大是指一次逻辑读取触发多次物理读取。在LSM树数据库（RocksDB、MDBX）中，查找一个键可能需要搜索多个层级。\u003C\u002Fp>\n\u003Ch2 id=\"\">真实案例\u003C\u002Fh2>\n\u003Cp>在MEV机器人中，每次模拟需要读取数十个存储槽。初始实现在每次模拟时直接查询数据库：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F O(N) - 每次模拟读取所有需要的槽\nfor slot in required_slots {\n    let value = db.get(slot)?;  \u002F\u002F 每次都是数据库查询\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"cachedb\">CacheDB优化\u003C\u002Fh2>\n\u003Cp>使用CacheDB模式——在第一次读取后缓存值，后续读取命中缓存：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct CacheDB&lt;DB&gt; {\n    inner: DB,\n    cache: HashMap&lt;StorageKey, StorageValue&gt;,\n}\n\nimpl&lt;DB: Database&gt; Database for CacheDB&lt;DB&gt; {\n    fn get(&amp;mut self, key: &amp;StorageKey) -&gt; Result&lt;StorageValue&gt; {\n        if let Some(value) = self.cache.get(key) {\n            return Ok(value.clone());  \u002F\u002F O(1) 缓存命中\n        }\n        let value = self.inner.get(key)?;  \u002F\u002F 数据库查询\n        self.cache.insert(key.clone(), value.clone());\n        Ok(value)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"o-n-vs-o-affected\">O(N) vs O(affected)\u003C\u002Fh2>\n\u003Cp>关键优化是从O(N)（每次模拟读取所有槽）变为O(affected)（只读取自上次以来变化的槽）。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>数据库读放大是高性能系统中的隐形杀手。CacheDB模式和增量更新策略可以将延迟从毫秒降低到微秒级。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.309688Z","性能调试——当数据库读取扼杀你的延迟","调试Rust系统中的数据库读放大问题。MDBX\u002FRocksDB真实案例，O(N) vs O(affected)优化和CacheDB模式。","性能调试 数据库读取",null,"index, follow",[22,27,31],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000005","PostgreSQL","postgresql",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","工程",[37,43,49],{"id":38,"title":39,"slug":40,"excerpt":41,"locale":12,"category_name":35,"published_at":42},"d0000000-0000-0000-0000-000000000668","为什么Bali在2026年正在成为东南亚的影响力科技中心","weishenme-bali-2026-zhengzai-chengwei-dongnanya-yingxiangli-keji-zhongxin","Bali在东南亚创业生态系统中排名第16位。随着Web3构建者、AI可持续发展初创公司和生态旅游科技公司的集中，该岛正在打造区域影响力科技之都的独特定位。","2026-03-28T10:44:48.898750Z",{"id":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":35,"published_at":48},"d0000000-0000-0000-0000-000000000667","ASEAN数据保护拼图：开发者合规清单","asean-shuju-baohu-pintu-kaifazhe-heguiqingdan","七个ASEAN国家现已拥有全面的数据保护法律，各自具有不同的同意模型、本地化要求和处罚结构。这是一份为构建多国应用程序的开发者准备的实用合规清单。","2026-03-28T10:44:48.893467Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":35,"published_at":54},"d0000000-0000-0000-0000-000000000666","Indonesia 290亿美元数字化转型：软件公司的机遇","indonesia-290yi-meiyuan-shuzihua-zhuanxing-ruanjian-gongsi-jiyu","Indonesia IT服务市场预计在2026年达到290.3亿美元，高于2025年的243.7亿美元。云基础设施、AI、电子商务和数据中心正在推动东南亚最快的增长。","2026-03-28T10:44:48.875457Z",{"id":13,"name":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]