MySQL加入表格的顺序是什么,它是如何选择的以及STRAIGHT_JOIN何时派上用场?何时使用straight_join?
回答
MySQL
仅能够操作的方式嵌套循环(可能使用索引)的,因此,如果两个连接表进行索引,时间为联接如果A
是领先和B * log(A)
如果B
是导致被计算为A * log(B)
。
很容易看到满足WHERE
条件的记录较少的表应该处于领先地位。
有迹象表明,影响连接性能的一些其他因素,如WHERE
条件,ORDER BY
和LIMIT
条款等MySQL
试图预测时间为连接顺序,如果统计数据是最新的做它相当不错。
STRAIGHT_JOIN
在统计信息不准确(比如说,自然倾斜)或优化程序中出现错误时非常有用。
例如,下面的空间连接:
SELECT *
FROM a
JOIN b
ON MBRContains(a.area, b.area)
是受一个连接交换(越小表由主导),然而,MBRContains
不转换为MBRWithin
并将所得计划不使用的指数。
在这种情况下,您应该使用STRAIGHT_JOIN
明确设置连接顺序。
表的顺序由优化程序指定。当优化器错误时,Straight_join派上用场,这种情况并不常见。我只在一次大连接中使用了它,优化器在连接中首先给出了一个特定的表(我在explain select命令中看到了它),所以我放置了表,以便稍后在连接中加入。它帮助很多加快查询。
正如其他人所说的关于优化器和哪些表可能符合较小结果集的标准,但这可能并不总是奏效。正如我一直在与政府合同/赠款数据库一起工作。这张表是大约1400多万条记录。然而,它也有超过20个查询表(州,国会区,业务分类类型,业主种族等)
无论如何,与这些较小的表,连接是使用其中一个小查找,回到主表然后加入其他所有人。它检查了数据库并在30多个小时后取消了查询。由于我的主表是FIRST,所有后来的查找和加入后,只需添加STRAIGHT_JOIN顶部FORCED我已列出的顺序和复杂的查询再运行约2小时(预计所有必须做的) 。
无论你的主要基础是什么,以后我发现的所有后续额外功能绝对有帮助。
但是什么原因?它不相关有常识,或者我想念一些事情;) – zapadlo
- 1. 总是使用Straight_JOIN是否有意义?
- 2. 的SQLAlchemy的MySQL STRAIGHT_JOIN
- 3. 有没有使用Laravel的ORM创建STRAIGHT_JOIN的方法?
- 4. Scailing for MySQL Queries(Straight_Join vs Inner Join)
- 5. MYSQL - STRAIGHT_JOIN在这段代码中做了什么?
- 6. 何时使用==以及何时使用?
- 7. 何时使用.exe,何时不使用?
- 8. 何时使用R,何时使用SQL?
- 9. 何时/何时使用JSON?
- 10. 何时使用Dispose或何时使用使用
- 11. 何时使用mysql_real_escape_string()
- 12. 何时使用Integer.parseint
- 13. 何时使用session_start()?
- 14. 何时使用this.method()?
- 15. 何时使用AngularJS?
- 16. 何时使用var?
- 17. 何时使用GAC?
- 18. 何时使用memcached
- 19. 何时使用TWaitResult.wrIOCompletion?
- 20. 何时使用ClassDefiner?
- 21. 何时使用parseInt
- 22. 何时使用chomp?
- 23. 何时使用getparent()
- 24. 何时使用$ .extend({...})?
- 25. 何时使用VectorDrawable?
- 26. 何时使用Mockito.verify()?
- 27. 何时使用{x:Type ...}?
- 28. 何时使用Jumbotron?
- 29. 何时使用MEF
- 30. 何时使用SharePointPermissionAttribute
相似问题:http://stackoverflow.com/questions/512294/when-to-use-straight-join-with-mysql – Jake