+ -
当前位置:首页 → 问答吧 → Mysql 强制连接顺序

Mysql 强制连接顺序

时间:2011-07-15

来源:互联网

语法如下:
SQL code

table_references:
    table_reference [, table_reference] …

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [[AS] alias]
        [{USE|IGNORE|FORCE} INDEX (key_list)]
  | ( table_references )
  | { OJ table_reference LEFT OUTER JOIN table_reference
        ON conditional_expr }

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON condition
  | table_reference LEFT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
  | table_reference RIGHT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

join_condition:
    ON conditional_expr
  | USING (column_list)




table_reference STRAIGHT_JOIN table_factor
这个可以强制链接顺序,但是他是JOIN的,如果是LEFT JOIN或RIGHT JOIN呢??

怎么样强制某个表在前面??

作者: zuoxingyu   发布时间: 2011-07-15

我也想知道..求解.

作者: mr_mablevi   发布时间: 2011-07-15

STRAIGHT_JOIN 无法应用于 LEFT JOIN 或 RIGHT JOIN。

变通一下:
SELECT * FROM a a1 
STRAIGHT_JOIN b b1 ON a1.id=b1.id 
LEFT JOIN a3 a2 ON a2.id=a2.id

作者: WWWWA   发布时间: 2011-07-15

select * from a left join b on a.id=b.id;

执行计划是先a 再b

2楼的这个变通办法没看明白。

作者: zuoxingyu   发布时间: 2011-07-15

zz 5.1 参考手册
联接优化器计算表应联接的顺序。LEFT JOIN和STRAIGHT_JOIN强制的表读顺序可以帮助联接优化器更快地工作,因为检查的表交换更少。请注意这说明如果执行下面类型的查询,MySQL进行全扫描b,因为LEFT JOIN强制它在d之前读取:

SELECT *
  FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;

作者: rucypli   发布时间: 2011-07-15