MySQL Presentations: Optimizing MySQL wrote:
When MySQL uses indexes
Using >, >=, =, <, <=, IF NULL and BETWEEN on a key.
SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5;
SELECT * FROM table_name WHERE key_part1 IS NULL;
When you use a LIKE that doesn't start with a wildcard.
SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'
Retrieving rows from other tables when performing joins.
SELECT * from t1,t2 where t1.col=t2.key_part
Find the MAX() or MIN() value for a specific index.
SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
ORDER BY or GROUP BY on a prefix of a key.
SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3
When all columns used in the query are part of one key.
SELECT key_part3 FROM table_name WHERE key_part1=1
--------------------------------------------------------------------------------
When MySQL doesn't use an index
Indexes are NOT used if MySQL can calculate that it will probably be
faster to scan the whole table. For example if key_part1 is evenly
distributed between 1 and 100, it's not good to use an index in the
following query:
SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90
If you are using HEAP tables and you don't search on all key parts with =
When you use ORDER BY on a HEAP table
If you are not using the first key part
SELECT * FROM table_name WHERE key_part2=1
If you are using LIKE that starts with a wildcard
SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'
When you search on one index and do an ORDER BY on another
SELECT * from table_name WHERE key_part1 = # ORDER BY key2
Read More about Optimizing MySQL Apps