MySQL uses a cost-based optimizer to determine the best way to resolve a query. In many cases, MySQL can calculate the best possible query plan, but sometimes MySQL does not have enough information about the data at hand and has to make “educated” guesses about the data.
For the cases when MySQL does not do the "right" thing, tools that you have available to help MySQL are:
mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
ANALYZE TABLEto update the key distributions for the scanned table. See Section 126.96.36.199, “ANALYZE TABLE Statement”.
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
IGNORE INDEXmay also be useful. See Section 8.9.4, “Index Hints”.
Global and table-level
STRAIGHT_JOIN. See Section 13.2.9, “SELECT Statement”.
You can tune global or thread-specific system variables. For example, start mysqld with the
--max-seeks-for-key=1000option or use
SET max_seeks_for_key=1000to tell the optimizer to assume that no key scan causes more than 1,000 key seeks. See Section 5.1.7, “Server System Variables”.