MySQL核心技術之「WHERE條件」

2021-09-14 05:48:07 字數 2461 閱讀 3909

先看一下呼叫鏈:

join::optimize()-->

make_join_select()-->

join_tab::set_condition()-->

這裡就把condition賦值給了join_tab。那麼condition是如何產生的呢?是在parse乙個query的時候,具體的是yacc產生的**,不用特意關心。舉例來說的,where s1>3 and s1<5 這個條件在parse的時候就會new item_cond_and呼叫下面的建構函式: item_cond_and(const pos &pos, item i1, item i2) :item_cond(pos, i1, i2) {}

這裡的pos帶了乙個char內容就是s1>3 and s1<5,item1是s1>3,item2是s1<5。這裡,item1實際上是item_func_gt物件,item2是item_func_lt物件。item_cond_and是從item_func派生出來的,item_func帶了乙個item* args成員變數,item1和item2就賦給了args。同時會把item_func的arg_count置為2.

在make_join_select中,

for (uint i=join->const_tables ; i < join->tables ; i++)

它遍歷當前的condition的item,然後生成了新的item fix,第一次生成了item_func_gt,第二次生成了item_func_lt,也就是說這裡生成的new_cond和傳入的是一樣的。之後在make_join_select裡把tmp設定進去:

*/        

if (cond && tmp)

}

if (!tab->table()->quick_keys.is_subset(tab->checked_keys) ||

!tab->needed_reg.is_subset(tab->checked_keys))

...if (join->attach_join_conditions(i))

使用cmp函式(item_cmpfunc.cc):

int arg_comparator::compare_int_signed()

呼叫longlong val1= (*a)->val_int(); 實際上是longlong item_field::val_int() -->

field_long::val_int(void)

item_field:

field *field;

field如何被賦值的?是被賦值為field_long型,裡面的ptr是如何被賦值的。

這裡要提到的是bit

是在

select_lex->prepare()-->

select_lex->setup_cond()

fix_field來呼叫

find_field_in_tables-->

find_field_in_table_ref-->

fld->table->mark_column_used(thd, fld, thd->mark_used_columns)-->

table::mark_column_used-->

case mark_columns_read:

bitmap_set_bit(read_set, field->field_index);

if (join->select_lex->m_parallel) opt_sum.cc:

opt_sum_query()
這裡的可能有用:

static bool init_fields(thd *thd, table_list *tables,

struct st_find_field *find_fields, uint count)

dbug_return(0);

}

在sql_join_buffer.cc有兩處bitmap_intersect和一處bitmap_copy

bitmap_intersect(table->read_set, &range_read_set);

longlong item_func_lt::val_int()

呼叫關係:

cmp.compare()-->

arg_comparator::compare() -->

int arg_comparator::compare_int_signed()

{ ...

longlong val1= (*a)->val_int();

這裡的呼叫:

(*a)->val_int()-->

item_field::val_int()

MySQL核心技術之「結果傳送」

本節我們主要討論count的結果處理與傳送。典型的sql語句為 select count from foo 結果累加呼叫鏈 join exec do select sub select evaluate join record end send group init sum functions re...

MySQL核心技術之「索引查詢」

mysql的索引查詢內部使用的是quick range結構。先讓我們看看呼叫流程 join optimize make join plan estimate rowcount get quick record count test quick select join init read record...

Docker 核心技術之映象

映象是乙個docker的可執行檔案,其中包括執行應用程式所需的所有 內容 依賴庫 環境變數和配置檔案等。通過映象可以建立乙個或多個容器。作用 命令格式 命令引數 options 只搜尋官方的 centos docker search f is official true centos作用 命令格式 ...