有什么更好的方式加入mysql?

时间:2014-05-22 06:46:28

标签: mysql

我想加入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

2 个答案:

答案 0 :(得分:2)

您展示的案例是等效的。您所描述的内容最终是相同的查询,数据库将会这样查看:数据库将制定查询计划。

你可以做的最好的事情就是使用EXPLAIN并查看你的查询实际上做了什么:这样你就可以看到它们可能会运行相同的,如果那里可能有一个瓶颈。< / p>

答案 1 :(得分:0)

@Nanne在他的回答中更新了通常mysql自己做的(正确排序)但是有些时候(罕见的情况)mysql可以以错误的顺序读取表连接并且可以杀死查询性能,在这种情况下你可以遵循以下方法 -

如果您可以过滤来自像table2和table3这样庞大的表中的数据(假设在加入这些表并应用过滤器后只能获得500条记录),那么首先过滤数据,然后您可以使用小表加入过滤后的数据..通过这种方式你可以获得性能,但可以有各种组合,所以你必须检查哪个连接你可以做更多的过滤..解释将帮助你了解它,索引将帮助你获得过滤数据。< / p>

在上面的方法之后你可以说mysql使用你的查询中的语法“SELECT STRAIGHT_JOIN .....”,就像有时候mysql不使用正确的索引一样,我们必须使用force index