Commit 384a0c0a authored by unknown's avatar unknown

InnoDB: Optimize page_cur_search_with_match().


innobase/btr/btr0cur.c:
  Disable the mode PAGE_CUR_LE_OR_EXTENDS at compile-time
innobase/include/page0cur.h:
  Disable the mode PAGE_CUR_LE_OR_EXTENDS at compile-time
  Do not define PAGE_CUR_DBG unless #ifdef UNIV_SEARCH_DEBUG
innobase/page/page0cur.c:
  Disable the mode PAGE_CUR_LE_OR_EXTENDS at compile-time
  Disable PAGE_CUR_DBG unless #ifdef UNIV_SEARCH_DEBUG
  
  page_cur_try_search_shortcut(): Optimize the predicates
  (compare the result of page_cmp_dtuple_rec_with_match() against 0,
  use page_rec_is_supremum()).
  
  page_cur_search_with_match(): Compare the result of
  cmp_dtuple_rec_with_match() against zero, add UNIV_LIKELY hints,
  replace duplicated code with gotos.
parent 14ade135
...@@ -316,7 +316,9 @@ btr_cur_search_to_nth_level( ...@@ -316,7 +316,9 @@ btr_cur_search_to_nth_level(
if (btr_search_latch.writer == RW_LOCK_NOT_LOCKED if (btr_search_latch.writer == RW_LOCK_NOT_LOCKED
&& latch_mode <= BTR_MODIFY_LEAF && info->last_hash_succ && latch_mode <= BTR_MODIFY_LEAF && info->last_hash_succ
&& !estimate && !estimate
#ifdef PAGE_CUR_LE_OR_EXTENDS
&& mode != PAGE_CUR_LE_OR_EXTENDS && mode != PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
&& srv_use_adaptive_hash_indexes && srv_use_adaptive_hash_indexes
&& btr_search_guess_on_hash(index, info, tuple, mode, && btr_search_guess_on_hash(index, info, tuple, mode,
latch_mode, cursor, latch_mode, cursor,
...@@ -391,8 +393,10 @@ btr_cur_search_to_nth_level( ...@@ -391,8 +393,10 @@ btr_cur_search_to_nth_level(
break; break;
default: default:
ut_ad(mode == PAGE_CUR_L ut_ad(mode == PAGE_CUR_L
|| mode == PAGE_CUR_LE #ifdef PAGE_CUR_LE_OR_EXTENDS
|| mode == PAGE_CUR_LE_OR_EXTENDS); || mode == PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
|| mode == PAGE_CUR_LE);
page_mode = mode; page_mode = mode;
break; break;
} }
......
...@@ -26,11 +26,13 @@ Created 10/4/1994 Heikki Tuuri ...@@ -26,11 +26,13 @@ Created 10/4/1994 Heikki Tuuri
#define PAGE_CUR_GE 2 #define PAGE_CUR_GE 2
#define PAGE_CUR_L 3 #define PAGE_CUR_L 3
#define PAGE_CUR_LE 4 #define PAGE_CUR_LE 4
#define PAGE_CUR_LE_OR_EXTENDS 5 /* This is a search mode used in /*#define PAGE_CUR_LE_OR_EXTENDS 5*/ /* This is a search mode used in
"column LIKE 'abc%' ORDER BY column DESC"; "column LIKE 'abc%' ORDER BY column DESC";
we have to find strings which are <= 'abc' or we have to find strings which are <= 'abc' or
which extend it */ which extend it */
#define PAGE_CUR_DBG 6 #ifdef UNIV_SEARCH_DEBUG
# define PAGE_CUR_DBG 6 /* As PAGE_CUR_LE, but skips search shortcut */
#endif /* UNIV_SEARCH_DEBUG */
#ifdef PAGE_CUR_ADAPT #ifdef PAGE_CUR_ADAPT
# ifdef UNIV_SEARCH_PERF_STAT # ifdef UNIV_SEARCH_PERF_STAT
......
...@@ -47,7 +47,6 @@ page_cur_try_search_shortcut( ...@@ -47,7 +47,6 @@ page_cur_try_search_shortcut(
not yet completely matched */ not yet completely matched */
page_cur_t* cursor) /* out: page cursor */ page_cur_t* cursor) /* out: page cursor */
{ {
int cmp;
rec_t* rec; rec_t* rec;
rec_t* next_rec; rec_t* next_rec;
ulint low_match; ulint low_match;
...@@ -79,9 +78,8 @@ page_cur_try_search_shortcut( ...@@ -79,9 +78,8 @@ page_cur_try_search_shortcut(
up_match = low_match; up_match = low_match;
up_bytes = low_bytes; up_bytes = low_bytes;
cmp = page_cmp_dtuple_rec_with_match(tuple, rec, offsets, &low_match, if (page_cmp_dtuple_rec_with_match(tuple, rec, offsets,
&low_bytes); &low_match, &low_bytes) < 0) {
if (cmp == -1) {
goto exit_func; goto exit_func;
} }
...@@ -89,9 +87,8 @@ page_cur_try_search_shortcut( ...@@ -89,9 +87,8 @@ page_cur_try_search_shortcut(
offsets = rec_get_offsets(next_rec, index, offsets, offsets = rec_get_offsets(next_rec, index, offsets,
dtuple_get_n_fields(tuple), &heap); dtuple_get_n_fields(tuple), &heap);
cmp = page_cmp_dtuple_rec_with_match(tuple, next_rec, offsets, if (page_cmp_dtuple_rec_with_match(tuple, next_rec, offsets,
&up_match, &up_bytes); &up_match, &up_bytes) >= 0) {
if (cmp != -1) {
goto exit_func; goto exit_func;
} }
...@@ -115,7 +112,7 @@ page_cur_try_search_shortcut( ...@@ -115,7 +112,7 @@ page_cur_try_search_shortcut(
ut_a(*ilow_matched_fields == low_match); ut_a(*ilow_matched_fields == low_match);
ut_a(*ilow_matched_bytes == low_bytes); ut_a(*ilow_matched_bytes == low_bytes);
#endif #endif
if (next_rec != page_get_supremum_rec(page)) { if (!page_rec_is_supremum(next_rec)) {
*iup_matched_fields = up_match; *iup_matched_fields = up_match;
*iup_matched_bytes = up_bytes; *iup_matched_bytes = up_bytes;
...@@ -137,6 +134,7 @@ exit_func: ...@@ -137,6 +134,7 @@ exit_func:
#endif #endif
#ifdef PAGE_CUR_LE_OR_EXTENDS
/******************************************************************** /********************************************************************
Checks if the nth field in a record is a character type field which extends Checks if the nth field in a record is a character type field which extends
the nth field in tuple, i.e., the field is longer or equal in length and has the nth field in tuple, i.e., the field is longer or equal in length and has
...@@ -185,6 +183,7 @@ page_cur_rec_field_extends( ...@@ -185,6 +183,7 @@ page_cur_rec_field_extends(
return(FALSE); return(FALSE);
} }
#endif /* PAGE_CUR_LE_OR_EXTENDS */
/******************************************************************** /********************************************************************
Searches the right position for a page cursor. */ Searches the right position for a page cursor. */
...@@ -240,8 +239,13 @@ page_cur_search_with_match( ...@@ -240,8 +239,13 @@ page_cur_search_with_match(
ut_ad(dtuple_validate(tuple)); ut_ad(dtuple_validate(tuple));
ut_ad(dtuple_check_typed(tuple)); ut_ad(dtuple_check_typed(tuple));
ut_ad((mode == PAGE_CUR_L) || (mode == PAGE_CUR_LE) ut_ad((mode == PAGE_CUR_L) || (mode == PAGE_CUR_LE)
|| (mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE) #ifdef PAGE_CUR_DBG
|| (mode == PAGE_CUR_LE_OR_EXTENDS) || (mode == PAGE_CUR_DBG)); || (mode == PAGE_CUR_DBG)
#endif /* PAGE_CUR_DBG */
#ifdef PAGE_CUR_LE_OR_EXTENDS
|| (mode == PAGE_CUR_LE_OR_EXTENDS)
#endif /* PAGE_CUR_LE_OR_EXTENDS */
|| (mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE));
page_check_dir(page); page_check_dir(page);
...@@ -261,16 +265,18 @@ page_cur_search_with_match( ...@@ -261,16 +265,18 @@ page_cur_search_with_match(
return; return;
} }
} }
/*#ifdef UNIV_SEARCH_DEBUG */ # ifdef PAGE_CUR_DBG
if (mode == PAGE_CUR_DBG) { if (mode == PAGE_CUR_DBG) {
mode = PAGE_CUR_LE; mode = PAGE_CUR_LE;
} }
/*#endif */ # endif
#endif #endif
/* The following flag does not work for non-latin1 char sets because /* The following flag does not work for non-latin1 char sets because
cmp_full_field does not tell how many bytes matched */ cmp_full_field does not tell how many bytes matched */
#ifdef PAGE_CUR_LE_OR_EXTENDS
ut_a(mode != PAGE_CUR_LE_OR_EXTENDS); ut_a(mode != PAGE_CUR_LE_OR_EXTENDS);
#endif /* PAGE_CUR_LE_OR_EXTENDS */
/* If mode PAGE_CUR_G is specified, we are trying to position the /* If mode PAGE_CUR_G is specified, we are trying to position the
cursor to answer a query of the form "tuple < X", where tuple is cursor to answer a query of the form "tuple < X", where tuple is
...@@ -308,33 +314,36 @@ page_cur_search_with_match( ...@@ -308,33 +314,36 @@ page_cur_search_with_match(
cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets, cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
&cur_matched_fields, &cur_matched_fields,
&cur_matched_bytes); &cur_matched_bytes);
if (cmp == 1) { if (UNIV_LIKELY(cmp > 0)) {
low_slot_match:
low = mid; low = mid;
low_matched_fields = cur_matched_fields; low_matched_fields = cur_matched_fields;
low_matched_bytes = cur_matched_bytes; low_matched_bytes = cur_matched_bytes;
} else if (cmp == -1) { } else if (UNIV_LIKELY(cmp /* == -1 */)) {
#ifdef PAGE_CUR_LE_OR_EXTENDS
if (mode == PAGE_CUR_LE_OR_EXTENDS if (mode == PAGE_CUR_LE_OR_EXTENDS
&& page_cur_rec_field_extends(tuple, mid_rec, && page_cur_rec_field_extends(tuple, mid_rec,
offsets, cur_matched_fields)) { offsets, cur_matched_fields)) {
low = mid;
low_matched_fields = cur_matched_fields; goto low_slot_match;
low_matched_bytes = cur_matched_bytes; }
} else { #endif /* PAGE_CUR_LE_OR_EXTENDS */
up_slot_match:
up = mid; up = mid;
up_matched_fields = cur_matched_fields; up_matched_fields = cur_matched_fields;
up_matched_bytes = cur_matched_bytes; up_matched_bytes = cur_matched_bytes;
}
} else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE } else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
|| mode == PAGE_CUR_LE_OR_EXTENDS) { #ifdef PAGE_CUR_LE_OR_EXTENDS
low = mid; || mode == PAGE_CUR_LE_OR_EXTENDS
low_matched_fields = cur_matched_fields; #endif /* PAGE_CUR_LE_OR_EXTENDS */
low_matched_bytes = cur_matched_bytes; ) {
goto low_slot_match;
} else { } else {
up = mid;
up_matched_fields = cur_matched_fields; goto up_slot_match;
up_matched_bytes = cur_matched_bytes;
} }
} }
...@@ -360,32 +369,35 @@ page_cur_search_with_match( ...@@ -360,32 +369,35 @@ page_cur_search_with_match(
cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets, cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
&cur_matched_fields, &cur_matched_fields,
&cur_matched_bytes); &cur_matched_bytes);
if (cmp == 1) { if (UNIV_LIKELY(cmp > 0)) {
low_rec_match:
low_rec = mid_rec; low_rec = mid_rec;
low_matched_fields = cur_matched_fields; low_matched_fields = cur_matched_fields;
low_matched_bytes = cur_matched_bytes; low_matched_bytes = cur_matched_bytes;
} else if (cmp == -1) { } else if (UNIV_LIKELY(cmp /* == -1 */)) {
#ifdef PAGE_CUR_LE_OR_EXTENDS
if (mode == PAGE_CUR_LE_OR_EXTENDS if (mode == PAGE_CUR_LE_OR_EXTENDS
&& page_cur_rec_field_extends(tuple, mid_rec, && page_cur_rec_field_extends(tuple, mid_rec,
offsets, cur_matched_fields)) { offsets, cur_matched_fields)) {
low_rec = mid_rec;
low_matched_fields = cur_matched_fields; goto low_rec_match;
low_matched_bytes = cur_matched_bytes; }
} else { #endif /* PAGE_CUR_LE_OR_EXTENDS */
up_rec_match:
up_rec = mid_rec; up_rec = mid_rec;
up_matched_fields = cur_matched_fields; up_matched_fields = cur_matched_fields;
up_matched_bytes = cur_matched_bytes; up_matched_bytes = cur_matched_bytes;
}
} else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE } else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
|| mode == PAGE_CUR_LE_OR_EXTENDS) { #ifdef PAGE_CUR_LE_OR_EXTENDS
low_rec = mid_rec; || mode == PAGE_CUR_LE_OR_EXTENDS
low_matched_fields = cur_matched_fields; #endif /* PAGE_CUR_LE_OR_EXTENDS */
low_matched_bytes = cur_matched_bytes; ) {
goto low_rec_match;
} else { } else {
up_rec = mid_rec;
up_matched_fields = cur_matched_fields; goto up_rec_match;
up_matched_bytes = cur_matched_bytes;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment