ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据库索引实战指南:B-Tree 结构、索引选型与 EXPLAIN ANALYZE 调优(解析 wigolo 提取基准的 Golden 参考文档)

数据库索引实战指南:B-Tree 结构、索引选型与 EXPLAIN ANALYZE 调优(解析 wigolo 提取基准的 Golden 参考文档) 数据库索引实战指南B-Tree 结构、索引选型与 EXPLAIN ANALYZE 调优解析 wigolo 提取基准的 Golden 参考文档【免费下载链接】wigoloThe go-to web for your AI coding agent — local-first search, fetch, crawl research over MCP. No API keys, no cloud, $0/query. Public beta.项目地址: https://gitcode.com/GitHub_Trending/wi/wigolo这是一篇以 wigolo 开源仓库中提取基准Extraction Benchmark的 golden 参考文档 benchmarks/extraction/fixtures/golden/article-002.md 为骨架的数据库索引实战指南。它既是一份可独立运行的 SQL 调优教程——覆盖 B-Tree 原理、六大索引类型、EXPLAIN ANALYZE验证与索引健康监控同时也是理解 wigolo 如何用 golden 文本量化评估网页内容提取质量的典型样本。读完本文你将掌握索引设计的关键决策点并能理解 wigolo 基准测试中以 golden 为真值的评估原理。该文档在 wigolo 中的定位提取基准的 Ground Truth在 wigolo 仓库中golden/article-002.md并不是一篇普通文档而是内容提取extraction基准测试的期望输出。它与同目录下另外 20 份 golden 文件一起被 manifest.json 注册为基准条目。manifest 中article-002的配置为category: article、expectedExtractor: defuddle、goldenPath: golden/article-002.md、tags: [async, javascript]并记录了对应的htmlFixturePath。基准运行器 runner.ts 的执行逻辑是读取 manifest按id/category/tags过滤条目filterManifestEntries对每个条目加载 HTML fixture调用extractContent(html, url)即 src/extraction/pipeline.ts 中向后兼容的旧版 facade底层委托给getExtractProvider().extract(...)得到提取结果用 metrics.ts 的computeMetrics(result.markdown, golden)计算提取文本与 golden 文本之间的相似度指标将 JSON 与 Markdown 报告写入输出目录。也就是说本文所讲解的索引知识本身正是 wigolo 用来检验从 HTML 中能否无损还原出结构化 Markdown 正文的标尺之一。一个提取器只有保住了这份文档里的标题层级、代码块、表格与要点才能拿到高分。索引的工作原理B-Tree 结构数据库索引是一种以额外存储空间和较慢写入为代价、换取表上数据检索速度的数据结构。索引会创建一个独立的数据结构典型为 B-tree 或 B tree维护对表中数据的有序引用没有索引时数据库必须执行全表扫描full table scan逐行读取寻找匹配。B-tree 索引把数据组织成一棵平衡树其结构要点根节点指向中间节点中间节点指向叶子节点叶子节点保存索引值及指向实际行的指针所有叶子节点处于相同深度保证查找时间一致。[50] / \ [20,35] [65,80] / | \ / | \ [10][25][40][55][70][90] | | | | | | rows rows rows rows rows rows查找复杂度O(log n)而全表扫描为O(n)。索引类型全景六种常见索引及其适用场景单列索引Single-Column IndexCREATE INDEX idx_users_email ON users (email); -- 加速如下查询: SELECT * FROM users WHERE email aliceexample.com;组合索引Composite / Multi-Column IndexCREATE INDEX idx_orders_user_date ON orders (user_id, created_at); -- 左前缀规则下可以加速: SELECT * FROM orders WHERE user_id 42; SELECT * FROM orders WHERE user_id 42 AND created_at 2024-01-01; -- 无法加速: SELECT * FROM orders WHERE created_at 2024-01-01; -- 缺少左前缀唯一索引Unique IndexCREATE UNIQUE INDEX idx_users_email_unique ON users (email); -- 既强制唯一性也加速查找部分索引Partial / Filtered Index-- PostgreSQL CREATE INDEX idx_orders_pending ON orders (created_at) WHERE status pending; -- 只索引 pending 订单体积远小于全量索引覆盖索引Covering IndexCREATE INDEX idx_users_covering ON users (email) INCLUDE (name, created_at); -- 该查询完全由索引回答无需回表: SELECT name, created_at FROM users WHERE email aliceexample.com;全文索引Full-Text Index-- PostgreSQL CREATE INDEX idx_articles_search ON articles USING GIN (to_tsvector(english, title || || body)); SELECT * FROM articles WHERE to_tsvector(english, title || || body) to_tsquery(database indexing);索引选择指南场景索引类型示例等值查找B-treeWHERE email ?范围查询B-treeWHERE created_at ?文本搜索GIN/GiSTWHERE body ?JSON 字段GINWHERE data {key: val}地理空间GiST/SP-GiSTWHERE ST_DWithin(point, ...)低基数列Bitmap自动WHERE status IN (active, pending)查询计划分析用 EXPLAIN ANALYZE 验证索引EXPLAIN ANALYZE SELECT * FROM users WHERE email aliceexample.com; -- 理想情况: Index Scan -- Index Scan using idx_users_email on users (cost0.42..8.44 rows1 width128) -- Index Cond: (email aliceexample.com::text) -- Actual time: 0.023..0.024 rows1 loops1 -- Planning Time: 0.089 ms -- Execution Time: 0.045 ms -- 糟糕情况: Sequential Scan索引未被使用 -- Seq Scan on users (cost0.00..124.50 rows1 width128) -- Filter: (email aliceexample.com::text) -- Rows Removed by Filter: 4999 -- Actual time: 2.145..2.145 rows1 loops1 -- Planning Time: 0.065 ms -- Execution Time: 2.178 ms同一查询在索引命中与未命中时执行时间从约 0.045ms 放大到约 2.178ms差距近 50 倍——这正是验证索引是否真正生效的最直接手段。golden 文档用这样一组对照输出展示了可验证的调优结论应如何表达也与 wigolo 基准中用可量化的指标对比两版提取器的评估哲学一脉相承。常见索引误区1. 过度建索引Over-Indexing每个索引都会拖慢 INSERT、UPDATE、DELETE——因为索引也要同步更新表大小索引数INSERT 时间索引开销1M 行20.3ms0.1ms1M 行50.3ms0.4ms1M 行100.3ms1.2ms1M 行200.3ms3.5ms2. 为低基数列建索引-- 错误: boolean 列只有两个值 CREATE INDEX idx_users_active ON users (is_active); -- 大表上优化器大概率会忽略该索引3. 组合索引列顺序错误左前缀规则决定了列顺序至关重要-- 索引: (a, b, c) WHERE a 1 -- 使用索引 WHERE a 1 AND b 2 -- 使用索引 WHERE a 1 AND b 2 AND c 3 -- 使用索引 WHERE b 2 -- 不使用索引 WHERE b 2 AND c 3 -- 不使用索引 WHERE a 1 AND c 3 -- 部分使用索引仅用到 a4. 对索引列套用函数-- 错误: 函数阻碍索引使用 SELECT * FROM users WHERE LOWER(email) aliceexample.com; -- 修正: 创建表达式索引 CREATE INDEX idx_users_email_lower ON users (LOWER(email));监控索引健康-- PostgreSQL: 找出未被使用的索引 SELECT schemaname || . || relname AS table, indexrelname AS index, pg_size_pretty(pg_relation_size(i.indexrelid)) AS size, idx_scan AS scans FROM pg_stat_user_indexes i JOIN pg_index USING (indexrelid) WHERE idx_scan 0 AND NOT indisunique ORDER BY pg_relation_size(i.indexrelid) DESC;-- 找出缺少索引的慢查询 SELECT query, calls, mean_exec_time, total_exec_time FROM pg_stat_statements WHERE mean_exec_time 100 ORDER BY total_exec_time DESC LIMIT 20;如何用仓库复现golden 驱动的质量评估理解 golden 文档的另一种方式是看 wigolo 如何度量提取结果 vs golden 真值的差距。核心逻辑在 metrics.ts 与 tokenizer.tsPrecision / Recall先把 Markdown 归一化——解包加粗、斜体、行内代码与链接、剥掉标题标记、列表标记、代码围栏normalizeText再按非字母数字边界切分为小写 token最后通过 token 集合重叠计算tokenOverlapF1Precision 与 Recall 的调和平均computeF1ROUGE-L基于最长公共子序列LCS采用空间优化的两行 DP 实现见 longestCommonSubsequence衡量长片段级的结构保真度标题数与链接数匹配用正则^#{1,6}\s与(?!!)\[[^\]]*\]\([^)]\)统计提取文本与 golden 的标题/链接数量是否一致countHeadings / countLinks——article-002 这样标题层级完整、含代码块与表格的样本对这两项指标尤其敏感。若要本地跑分可以执行专项脚本RUN_EXTRACT_BENCH1 npx tsx benchmarks/extraction/per-category.ts该脚本per-category.ts会把每个 manifest fixture 同时跑过 legacy 集成管线extractContent与 v1 路由提取器getExtractProvider().extract(...)输出到benchmarks/extraction/output/per-category.json并施加两道质量门禁聚合 F1 不得低于 legacy单类别 F1 下降不得超过 3%PER_CATEGORY_DROP_THRESHOLD 0.03任一类别超限则以非零退出码终止。总结索引用写入速度与存储空间换取读取速度B-tree 索引覆盖大多数场景等值与范围查询组合索引遵循左前缀规则列顺序决定可用性用EXPLAIN ANALYZE验证索引是否真正生效定期监控未使用索引并清理只为出现在 WHERE、JOIN、ORDER BY 中的列建索引。延伸阅读仓库内golden 文档原文 与 manifest.json查看全部 21 个基准条目的分类与期望提取器runner.ts基准运行器理解 fixture 加载、并发批次与报告生成metrics.ts 与 tokenizer.tsPrecision / Recall / F1 / ROUGE-L 与标题链接计数的具体实现per-category.tslegacy 与 v1 两版提取器的逐类别对比与质量门禁pipeline.ts 与 extract-provider.ts提取管线的入口与 provider 路由是 golden 基准所检验的被测对象。【免费下载链接】wigoloThe go-to web for your AI coding agent — local-first search, fetch, crawl research over MCP. No API keys, no cloud, $0/query. Public beta.项目地址: https://gitcode.com/GitHub_Trending/wi/wigolo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表