Commit eec32a33 authored by Sergei Golubchik's avatar Sergei Golubchik

Optimize use of SEARCH_SAVE_BUFF in Aria

(less not-needed copies of key pages)

storage/maria/ma_rkey.c:
  Fixed wrong test if SEARCH_SAVE_BUFF should be set.
  Now we assume that if we are doing HA_READ_KEY_EXACT,
  we don't have to copy the last key buffer
  (in other words, it's not likely this will be followed
  by a read-next call)
parent 418df96d
...@@ -83,10 +83,11 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data, ...@@ -83,10 +83,11 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data,
rw_rdlock(&keyinfo->root_lock); rw_rdlock(&keyinfo->root_lock);
nextflag= maria_read_vec[search_flag] | key.flag; nextflag= maria_read_vec[search_flag] | key.flag;
if (search_flag != HA_READ_KEY_EXACT || if (search_flag != HA_READ_KEY_EXACT)
((keyinfo->flag & (HA_NOSAME | HA_NULL_PART)) != HA_NOSAME)) {
/* Assume we will get a read next/previous call after this one */
nextflag|= SEARCH_SAVE_BUFF; nextflag|= SEARCH_SAVE_BUFF;
}
switch (keyinfo->key_alg) { switch (keyinfo->key_alg) {
#ifdef HAVE_RTREE_KEYS #ifdef HAVE_RTREE_KEYS
case HA_KEY_ALG_RTREE: case HA_KEY_ALG_RTREE:
...@@ -103,8 +104,6 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data, ...@@ -103,8 +104,6 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data,
if (!_ma_search(info, &key, nextflag, info->s->state.key_root[inx])) if (!_ma_search(info, &key, nextflag, info->s->state.key_root[inx]))
{ {
MARIA_KEY lastkey; MARIA_KEY lastkey;
lastkey.keyinfo= keyinfo;
lastkey.data= info->lastkey_buff;
/* /*
Found a key, but it might not be usable. We cannot use rows that Found a key, but it might not be usable. We cannot use rows that
are inserted by other threads after we got our table lock are inserted by other threads after we got our table lock
...@@ -129,6 +128,8 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data, ...@@ -129,6 +128,8 @@ int maria_rkey(MARIA_HA *info, uchar *buf, int inx, const uchar *key_data,
break; break;
} }
lastkey.keyinfo= keyinfo;
lastkey.data= info->lastkey_buff;
do do
{ {
uint not_used[2]; uint not_used[2];
......
...@@ -45,7 +45,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record, ...@@ -45,7 +45,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
info->update&= ~HA_STATE_RNEXT_SAME; info->update&= ~HA_STATE_RNEXT_SAME;
DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH); DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH);
if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key])) if (_ma_search(info, &key, SEARCH_FIND | SEARCH_SAVE_BUFF,
info->s->state.key_root[def->key]))
{ {
info->page_changed=1; /* Can't optimize read next */ info->page_changed=1; /* Can't optimize read next */
info->cur_row.lastpos= lastpos; info->cur_row.lastpos= lastpos;
......
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