贪婪算法总是最适合为数据库选择合适的索引 table 吗?

Is Greedy Algorithm always best for choosing proper indexes for database table?

在 Garcia-Molina、Ullman、Widom 所著的 "Database Systems: The Complete Book" 中,专门介绍索引的章节中写道,为给定数据库选择最佳索引的贪婪算法是有效的。贪婪的意思是根据一些分析选择最好的索引,然后对剩余的索引重复分析(包括上一步新添加的索引的信息),再次选择最好的,等等

根据作者的说法,我们必须记住,使用一个或另一个索引也会影响其他索引的性能。

我很好奇,"greedy way"是只有效还是保证最优? 为什么是effective/optimal?

对于MySQL,根本没有使用"greedy"方法(据我所知)。相反,它使用统计数据,加上对 BTree 的探测来确定每个索引可能 "cost" 的内容。那就拿最便宜的吧。

在头脑中模拟 "cost" 模型是不切实际的;相反,请参阅以下内容,其中提供了一些几乎总是有效的通用规则: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

没有方法是"guaranteed to be optimal"。许多方法 (greedy/cost/cookbook/etc) 通常 最优。

如果算法花费太多时间来决定什么是最优的,那么这会占用实际执行查询的时间!这有点像 "heisenberg uncertainty principle" 优化查询。

有时候"optimal"是忽略所有的索引,只扫描table。这是因为在索引和数据之间来回跳动 可能 使使用索引 更慢 。这个论坛到处都是不明白的人问"Why didn't MySQL use my index?"