[ this is a re-posting of what I published on the MySQL server team blog a few days ago ] When the MySQL server receives a SELECT query, the query goes through several consecutive phases: parsing : SQL words are recognized, the query is split into different parts following the SQL grammar rules: a list of selected expressions, a list of tables to read, a WHERE condition, … resolution : the output of the parsing stage contains names of columns and names of tables. Resolution is about making sense out of this. For example, in “ WHERE foo=3 “, “foo” is a column name without a table name; by applying SQL name resolution rules, we discover the table who contains “foo” (it can be complicated if subqueries or outer joins are involved). optimization : finding the best way to read tables: the best order of tables, and for each table, the best way to access it (index lookup, index scan, …). The output is the so-called “plan”. execution : we read tables as dictated by the pl