mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Better comments
This commit is contained in:
@@ -15,6 +15,43 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
== EXPLAIN/ANALYZE architecture ==
|
||||||
|
|
||||||
|
=== [SHOW] EXPLAIN data ===
|
||||||
|
Query optimization produces two data structures:
|
||||||
|
1. execution data structures themselves (eg. JOINs, JOIN_TAB, etc, etc)
|
||||||
|
2. Explain data structures.
|
||||||
|
|
||||||
|
#2 are self contained set of data structures that has sufficient info to
|
||||||
|
produce output of SHOW EXPLAIN, EXPLAIN [FORMAT=JSON], or
|
||||||
|
ANALYZE [FORMAT=JSON], without accessing the execution data structures.
|
||||||
|
|
||||||
|
(the only exception is that Explain data structures keep Item* pointers,
|
||||||
|
and we require that one might call item->print(QT_EXPLAIN) when printing
|
||||||
|
FORMAT=JSON output)
|
||||||
|
|
||||||
|
=== ANALYZE data ===
|
||||||
|
EXPLAIN data structures have embedded ANALYZE data structures. These are
|
||||||
|
objects that are used to track how the parts of query plan were executed:
|
||||||
|
how many times each part of query plan was invoked, how many rows were
|
||||||
|
read/returned, etc.
|
||||||
|
|
||||||
|
Each execution data structure keeps a direct pointer to its ANALYZE data
|
||||||
|
structure. It is needed so that execution code can quickly increment the
|
||||||
|
counters.
|
||||||
|
|
||||||
|
(note that this increases the set of data that is frequently accessed
|
||||||
|
during the execution. What is the impact of this?)
|
||||||
|
|
||||||
|
Since ANALYZE/EXPLAIN data structures are separated from execution data
|
||||||
|
structures, it is easy to have them survive until the end of the query,
|
||||||
|
where we can return ANALYZE [FORMAT=JSON] output to the user, or print
|
||||||
|
it into the slow query log.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
class String_list: public List<char>
|
class String_list: public List<char>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -43,7 +80,6 @@ public:
|
|||||||
|
|
||||||
ha_rows r_scans; /* How many scans were ran on this join_tab */
|
ha_rows r_scans; /* How many scans were ran on this join_tab */
|
||||||
ha_rows r_rows; /* How many rows we've got after that */
|
ha_rows r_rows; /* How many rows we've got after that */
|
||||||
// ha_rows r_rows_after_table_cond; /* Rows after applying the table condition */
|
|
||||||
ha_rows r_rows_after_where; /* Rows after applying attached part of WHERE */
|
ha_rows r_rows_after_where; /* Rows after applying attached part of WHERE */
|
||||||
|
|
||||||
bool has_scans() { return (r_scans != 0); }
|
bool has_scans() { return (r_scans != 0); }
|
||||||
@@ -103,7 +139,7 @@ public:
|
|||||||
{ tracker->stop_tracking(); }
|
{ tracker->stop_tracking(); }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A class for tracking execution time
|
A class for tracking time it takes to do a certain action
|
||||||
*/
|
*/
|
||||||
class Exec_time_tracker
|
class Exec_time_tracker
|
||||||
{
|
{
|
||||||
@@ -127,7 +163,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// interface for getting the time
|
// interface for getting the time
|
||||||
//loops, starts, stops
|
|
||||||
ulonglong get_loops() { return count; }
|
ulonglong get_loops() { return count; }
|
||||||
double get_time_ms()
|
double get_time_ms()
|
||||||
{
|
{
|
||||||
@@ -710,7 +745,7 @@ public:
|
|||||||
// Valid if ET_USING tag is present
|
// Valid if ET_USING tag is present
|
||||||
Explain_quick_select *quick_info;
|
Explain_quick_select *quick_info;
|
||||||
|
|
||||||
/* Non-NULL values means this tab uses "range checked for each record" */
|
/* Non-NULL value means this tab uses "range checked for each record" */
|
||||||
Explain_range_checked_fer *range_checked_fer;
|
Explain_range_checked_fer *range_checked_fer;
|
||||||
|
|
||||||
bool full_scan_on_null_key;
|
bool full_scan_on_null_key;
|
||||||
|
Reference in New Issue
Block a user