The Mysql query run process is broadly divided into 4 stages:
Grammar analysis (sql_parse.cc< lexical analysis, grammar analysis, semantic check >)
>>sql_resolver.cc # Join.prepare
Generate logical Query plan (sql_optimizer.cc)
>># join.optimize
Generate physical query plan (sql_planner.cc)
Run the explain plan (sql_executor.cc) join.exec
Join.prepare ():
Redundant clause elimination for subqueries
In type subquery optimization Resolve_subquery ()
To optimize a simple subquery by converting a all/any type subquery to a MIN/MAX operation
Join.optimize ():
Subquery Pull-up flatten_subqueries ()
Optimize the outer connection for internal connection simplify_joins ()
Eliminate nested connections
WHERE clause, join/on clause, having clause simplification, expression simplification with constants, equation merging Optimize_cond () Opt_sum_query ()
Optimization does not have a GROUP BY clause under the COUNT (*) min () man ()
Determine multi-table connection path Make_join_statistice ()
Optimize distinct
Create temporary table storage temporary results optimized grouping sort Choose_table_order ()
In fact, logical and physical optimization, a bit confusing, not understood,
Is that after the physical query optimization, some logical optimizations are continued.
There are only two types of single-table scans:
Index Scan (others), table Scan (Jt_all)
Opt_range.h > class quick_select_i > Using index to scan total drop interface
See source code for several sub-categories;
Basic classes and structs:
Query Tree Class St_select_lex
Index struct St_key_create_information class Key_part_spec
Connection Table St_join_table
Connection Class Join:public Sql_alloc
Condition Cond_equal
Position struct St_position
Cost Estimation cost_estimate
SELECT now (), Curdate (), Curtime ()