我想加入3个或更多表格
table1 - 1千条记录
table2 - 100千条记录
table3 - 10百万记录
以下哪项是最佳的(速度明智的表现): -
注意:pk和fk是各个表的主键和外键,FILTER_CONDITION1和FILTER_CONDITION2分别是限制记录查询通常在哪里找到
案例1 :首先使用较小的表格,稍后再加入较大的表格
Select table1.*,table2.*,table3.*
from table1
join table2
on table1.fk = table2.pk and FILTER_CONDITION1
join table3
on table2.fk = table3.pk and FILTER_CONDITION2
案例2
Select table1.*,table2.*,table3.*
from table3
join table2
on table2.fk = table3.pk and FILTER_CONDITION2
join table1
on table1.fk = table2.pk and FILTER_CONDITION1
案例3
Select table1.*,table2.*,table3.*
from table3
join table2
on table2.fk = table3.pk
join table1
on table1.fk = table2.pk
where FILTER_CONDITION1 and FILTER_CONDITION2
答案 0 :(得分:2)
您展示的案例是等效的。您所描述的内容最终是相同的查询,数据库将会这样查看:数据库将制定查询计划。
你可以做的最好的事情就是使用EXPLAIN并查看你的查询实际上做了什么:这样你就可以看到它们可能会运行相同的,如果那里可能有一个瓶颈。< / p>
答案 1 :(得分:0)
@Nanne在他的回答中更新了通常mysql自己做的(正确排序)但是有些时候(罕见的情况)mysql可以以错误的顺序读取表连接并且可以杀死查询性能,在这种情况下你可以遵循以下方法 -
如果您可以过滤来自像table2和table3这样庞大的表中的数据(假设在加入这些表并应用过滤器后只能获得500条记录),那么首先过滤数据,然后您可以使用小表加入过滤后的数据..通过这种方式你可以获得性能,但可以有各种组合,所以你必须检查哪个连接你可以做更多的过滤..解释将帮助你了解它,索引将帮助你获得过滤数据。< / p>
在上面的方法之后你可以说mysql使用你的查询中的语法“SELECT STRAIGHT_JOIN .....”,就像有时候mysql不使用正确的索引一样,我们必须使用force index