Commit 384a0c0a authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -316,7 +316,9 @@ btr_cur_search_to_nth_level(
	if (btr_search_latch.writer == RW_LOCK_NOT_LOCKED
		&& latch_mode <= BTR_MODIFY_LEAF && info->last_hash_succ
		&& !estimate
#ifdef PAGE_CUR_LE_OR_EXTENDS
		&& mode != PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
		&& srv_use_adaptive_hash_indexes
	        && btr_search_guess_on_hash(index, info, tuple, mode,
						latch_mode, cursor,
@@ -391,8 +393,10 @@ btr_cur_search_to_nth_level(
		break;
	default:
		ut_ad(mode == PAGE_CUR_L
			|| mode == PAGE_CUR_LE
			|| mode == PAGE_CUR_LE_OR_EXTENDS);
#ifdef PAGE_CUR_LE_OR_EXTENDS
			|| mode == PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
			|| mode == PAGE_CUR_LE);
		page_mode = mode;
		break;
	}
+4 −2
Original line number Diff line number Diff line
@@ -26,11 +26,13 @@ Created 10/4/1994 Heikki Tuuri
#define	PAGE_CUR_GE	2
#define	PAGE_CUR_L	3
#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";
				 we have to find strings which are <= 'abc' or
				 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 UNIV_SEARCH_PERF_STAT
+56 −44
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ page_cur_try_search_shortcut(
				not yet completely matched */
	page_cur_t*	cursor) /* out: page cursor */ 
{
	int	cmp;
	rec_t*	rec;
	rec_t*	next_rec;
	ulint	low_match;
@@ -79,9 +78,8 @@ page_cur_try_search_shortcut(
	up_match = low_match;
	up_bytes = low_bytes;

	cmp = page_cmp_dtuple_rec_with_match(tuple, rec, offsets, &low_match,
								&low_bytes);
	if (cmp == -1) {
	if (page_cmp_dtuple_rec_with_match(tuple, rec, offsets,
						&low_match, &low_bytes) < 0) {
		goto exit_func;
	}

@@ -89,9 +87,8 @@ page_cur_try_search_shortcut(
	offsets = rec_get_offsets(next_rec, index, offsets,
				dtuple_get_n_fields(tuple), &heap);

	cmp = page_cmp_dtuple_rec_with_match(tuple, next_rec, offsets,
						&up_match, &up_bytes);
	if (cmp != -1) {
	if (page_cmp_dtuple_rec_with_match(tuple, next_rec, offsets,
						&up_match, &up_bytes) >= 0) {
		goto exit_func;
	}

@@ -115,7 +112,7 @@ page_cur_try_search_shortcut(
	ut_a(*ilow_matched_fields == low_match);
	ut_a(*ilow_matched_bytes == low_bytes);
#endif
	if (next_rec != page_get_supremum_rec(page)) {
	if (!page_rec_is_supremum(next_rec)) {

		*iup_matched_fields = up_match;
		*iup_matched_bytes = up_bytes;
@@ -137,6 +134,7 @@ page_cur_try_search_shortcut(

#endif

#ifdef PAGE_CUR_LE_OR_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
@@ -185,6 +183,7 @@ page_cur_rec_field_extends(

        return(FALSE);
}
#endif /* PAGE_CUR_LE_OR_EXTENDS */

/********************************************************************
Searches the right position for a page cursor. */
@@ -240,8 +239,13 @@ page_cur_search_with_match(
	ut_ad(dtuple_validate(tuple));
	ut_ad(dtuple_check_typed(tuple));
	ut_ad((mode == PAGE_CUR_L) || (mode == PAGE_CUR_LE)
	      || (mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE)
	      || (mode == PAGE_CUR_LE_OR_EXTENDS) || (mode == PAGE_CUR_DBG));
#ifdef 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);

@@ -261,16 +265,18 @@ page_cur_search_with_match(
	    		return;
	    	}
	}
/*#ifdef UNIV_SEARCH_DEBUG */
# ifdef PAGE_CUR_DBG
	if (mode == PAGE_CUR_DBG) {
		mode = PAGE_CUR_LE;
	}
/*#endif */
# endif
#endif	

	/* The following flag does not work for non-latin1 char sets because
	cmp_full_field does not tell how many bytes matched */
#ifdef 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
	cursor to answer a query of the form "tuple < X", where tuple is
@@ -308,33 +314,36 @@ page_cur_search_with_match(
		cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
						&cur_matched_fields,
						&cur_matched_bytes);
		if (cmp == 1) {
		if (UNIV_LIKELY(cmp > 0)) {
low_slot_match:
			low = mid;
			low_matched_fields = cur_matched_fields;
			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
			    && page_cur_rec_field_extends(tuple, mid_rec,
						offsets, cur_matched_fields)) {
				low = mid;
				low_matched_fields = cur_matched_fields;
				low_matched_bytes = cur_matched_bytes;
			} else {

				goto low_slot_match;
			}
#endif /* PAGE_CUR_LE_OR_EXTENDS */
up_slot_match:
			up = mid;
			up_matched_fields = cur_matched_fields;
			up_matched_bytes = cur_matched_bytes;
			}

		} else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
			   || mode == PAGE_CUR_LE_OR_EXTENDS) {
			low = mid;
			low_matched_fields = cur_matched_fields;
			low_matched_bytes = cur_matched_bytes;
#ifdef PAGE_CUR_LE_OR_EXTENDS
			   || mode == PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
		) {

			goto low_slot_match;
		} else {
			up = mid;
			up_matched_fields = cur_matched_fields;
			up_matched_bytes = cur_matched_bytes;

			goto up_slot_match;
		}
   	}

@@ -360,32 +369,35 @@ page_cur_search_with_match(
		cmp = cmp_dtuple_rec_with_match(tuple, mid_rec, offsets,
						&cur_matched_fields,
						&cur_matched_bytes);
		if (cmp == 1) {
		if (UNIV_LIKELY(cmp > 0)) {
low_rec_match:
			low_rec = mid_rec;
			low_matched_fields = cur_matched_fields;
			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
			    && page_cur_rec_field_extends(tuple, mid_rec,
						offsets, cur_matched_fields)) {
				low_rec = mid_rec;
				low_matched_fields = cur_matched_fields;
				low_matched_bytes = cur_matched_bytes;
			} else {

				goto low_rec_match;
			}
#endif /* PAGE_CUR_LE_OR_EXTENDS */
up_rec_match:
			up_rec = mid_rec;
			up_matched_fields = cur_matched_fields;
			up_matched_bytes = cur_matched_bytes;
			}
		} else if (mode == PAGE_CUR_G || mode == PAGE_CUR_LE
			   || mode == PAGE_CUR_LE_OR_EXTENDS) {
			low_rec = mid_rec;
			low_matched_fields = cur_matched_fields;
			low_matched_bytes = cur_matched_bytes;
#ifdef PAGE_CUR_LE_OR_EXTENDS
			   || mode == PAGE_CUR_LE_OR_EXTENDS
#endif /* PAGE_CUR_LE_OR_EXTENDS */
		) {

			goto low_rec_match;
		} else {
			up_rec = mid_rec;
			up_matched_fields = cur_matched_fields;
			up_matched_bytes = cur_matched_bytes;

			goto up_rec_match;
		}
   	}