在数据库领域中,“贪心算法”通常不是像在算法竞赛里那样直接写一段贪心代码去跑,而是用在查询优化、调度、索引选择、物理设计等决策过程中。下面从几个典型场景说明数据库是如何用贪心算法的。
贪心算法的核心:
数据库系统非常看重响应时间和可扩展性,所以经常用贪心来换“足够好”的解。
多表 JOIN 时,可能的连接顺序是指数级的。
贪心做法(如左深树贪心):
示例:
表: A(1000行), B(10行), C(100行)
贪心:
先选 B
再选和 B JOIN 代价最小的 C
最后 A
✅ 优点:快
❌ 缺点:可能不是最优连接树
给定一堆 SQL,要选一组索引加速查询,但索引太多会拖慢写入。
贪心算法:
伪代码:
while 索引数 < 上限:
选一个能最大减少总代价的索引
加入索引集合
这是很多数据库顾问工具(如 SQL Server Index Advisor)的思路。
优化器常结合:
例如:
这是一种“局部最优”的执行顺序。
类似索引选择:
在并发系统中:
这属于调度贪心。
| 原因 | 说明 |
|---|---|
| 搜索空间巨大 | JOIN、索引组合是指数级 |
| 实时性要求 | 优化本身不能太慢 |
| 代价模型不精确 | 全局最优意义有限 |
| 工程可行 | 贪心易实现、稳定 |
多表 JOIN:
A ⋈ B ⋈ C
贪心可能得到: (A ⋈ B) ⋈ C
最优可能是: A ⋈ (B ⋈ C)
所以数据库常配合:
remaining = {B, C, D}
plan = A
while remaining not empty:
best = argmin cost(plan ⋈ t) for t in remaining
plan = plan ⋈ best
remaining.remove(best)
数据库用贪心算法,是在“优化时间”和“优化质量”之间做工程权衡,常见于查询优化、索引选择和调度。
如果你愿意,我也可以:
你更想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。