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:
EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
to update the
key distributions for the scanned table. See
Section 18.104.22.168, “ANALYZE TABLE Syntax”.
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX and
INDEX may also be useful. See
Section 22.214.171.124, “Index Hint Syntax”.
Global and table-level
Section 13.2.8, “SELECT Syntax”.
You can tune global or thread-specific system variables. For
example, start mysqld with the
option or use
to tell the optimizer to assume that no key scan causes more
than 1,000 key seeks. See
Section 5.1.4, “Server System Variables”.