有人可以向我解释或指向一个解释关系数据库(如Postgres或MySQL,我更多地使用Postgres)的资源如何实现join
?
例如,我可以粗略地告诉您索引可能由B树组成,其中节点是where
子句中可能存在的条件。只要更改涉及索引(例如insert
),就会建立此索引。根据这些信息,我可以假设未加索引的列在insert
处会更快,并且索引可能对某些搜索没有帮助,例如regex
或like
模式匹配。
我希望对您执行一项或多项join
时会发生的情况有类似或更好的理解。
答案 0 :(得分:9)
在Postgresql中,planner / optimizer计算以下3种方法中的哪一种(来自PostgreSQL documentation):
嵌套循环连接:对于左关系中找到的每一行,扫描一次正确的关系。该策略易于实施,但可能非常耗时。 (但是,如果可以使用索引扫描扫描正确的关系,这可能是一个很好的策略。可以使用左关系的当前行中的值作为右侧索引扫描的键。)
合并连接:在连接开始之前,每个关系都在连接属性上排序。然后并行扫描两个关系,并组合匹配的行以形成连接行。这种连接更具吸引力,因为每个关系只需要扫描一次。可以通过显式排序步骤或通过使用连接键上的索引以正确的顺序扫描关系来实现所需的排序。
散列连接:首先扫描正确的关系并将其加载到散列表中,使用其连接属性作为散列键。接下来扫描左关系,并将找到的每一行的相应值用作哈希键,以查找表中的匹配行。