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

2021-09-16 12:22:49 字數 2254 閱讀 7673

mysql的索引查詢內部使用的是quick range結構。先讓我們看看呼叫流程:

join->optimize()-->

make_join_plan()-->

estimate_rowcount()-->

get_quick_record_count()-->

test_quick_select()-->

...join_init_read_record()(這個函式設定要使用的讀取操作為rr_quick())-->

read_record(實際上是quick_range_select::get_next())-->

ha_innobase::multi_range_read_next-->

dsmrr_impl::dsmrr_next-->

handler::multi_range_read_next-->

如果是第一次:mrr_funcs.next(mrr_iter, &mrr_cur_range)實際上是呼叫:quick_range_seq_next

如果不是:read_range_next

quick_range_seq_next最重要的作用是設定範圍查詢的上下邊界:

uint quick_range_seq_next(range_seq_t rseq, key_multi_range *range)

上面函式中,設定上下邊界的的**:

start_key->key=    cur->min_key; 為5

end_key->key= cur->max_key; 為7

start_key->flag=ha_read_key_or_next;

end_key->flag=ha_read_before_key;

執行完quick_range_seq_next,開始真正執行讀取操作:

read_range_first

/** @brief

read first row between two ranges.

store ranges for future calls to read_range_next.

@param start_key start key. is 0 if no min range

@param end_key end key. is 0 if no max range

@param eq_range_arg set to 1 if start_key == end_key

@param sorted set to 1 if result should be sorted per key

@note

record is read into table->record[0]

@retval

0 found row

@retval

ha_err_end_of_file no rows in range

@retval

\# error code

*/int handler::read_range_first(const key_range *start_key,

const key_range *end_key,

bool eq_range_arg,

bool sorted /* ignored */)

else

}

這裡會設定結束邊界:set_end_range(end_key, range_scan_asc); end_key為7。接下來讀取第一條記錄:

if (!start_key)            // read first record

result= ha_index_first(table->record[0]);

else

result= ha_index_read_map(table->record[0],

start_key->key,

start_key->keypart_map,

start_key->flag);

if (compare_key(end_range) <= 0)

else

}

這個就是用來判斷讀取的記錄是不是到達了上界,如果是則返回ha_err_end_of_file結束。

MySQL核心技術之「WHERE條件」

先看一下呼叫鏈 join optimize make join select join tab set condition 這裡就把condition賦值給了join tab。那麼condition是如何產生的呢?是在parse乙個query的時候,具體的是yacc產生的 不用特意關心。舉例來說的,...

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

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

搜尋引擎核心技術

搜尋引擎的定義 搜尋引擎是傳統ir技術在web環境中的應用。一般來說,搜尋引擎是一種用於幫助使用者在internet上查詢資訊的搜尋工具,它以一定的策略在internet中搜尋,發現資訊,對資訊進行理解,提取,組織和處理,並為使用者提供檢索服務,從而起到資訊導航的目的。搜尋引擎的體系結構 searc...