Is there any way to force MySQL use Hash Join instead of Nested Loop Join? According to the document MySQL Explain Output format, MySQL resolves all joins using a nested-loop join method. Is there any way to force MySQL to use a hash join?
Up to the (recently released) 5.6 version, no, you can't. Unfortunately, the only method that the optimizer knows is nested-loop method. As the 5.6 documentation says:


  MySQL resolves all joins using a nested-loop join method.


In other words, no hash join algorith or variation has been implemented, not even in version 5.7 - although that is still in development (hope never dies).



There is one alternative. MariaDB, a MySQL fork has implemented various other join methods in the latest (5.3 and 5.5) releases which can be drop-in replacements of MySQL (5.1 and 5.5 respectively) versions.

In their Block-Based Join Algorithms page, they describe the new methods:


  In the versions of MariaDB/MySQL before 5.3 only one block-based join algorithm was implemented: the Block Nested Loops (BNL) join algorithm. It could only be used for inner joins. MariaDB 5.3 (and later) enhances the implementation of BNL joins and provides a variety of block-based join algorithms that can be used for inner joins, outer joins, and semi-joins. Block-based join algorithms in MariaDB employ a join buffer to accumulate records of the first join operand before they start looking for matches in the second join operand.
  
  This page documents the various block-based join algorithms.
  
  
  Block Nested Loop (BNL) join
  Block Nested Loop Hash (BNLH) join
  Block Index join known as Batch Key Access (BKA) join
  Block Index Hash join known as Batch Key Access Hash (BKAH) join  
  


There are also some optimizer switches that affect which algorithms will be considered when optimizing a query.