diff options
author | unknown <dlenev@brandersnatch.localdomain> | 2004-03-28 04:11:54 +0400 |
---|---|---|
committer | unknown <dlenev@brandersnatch.localdomain> | 2004-03-28 04:11:54 +0400 |
commit | f6a8ec5f925ec7d37d2858c5799b7a91a95accca (patch) | |
tree | c5035ed539732100b50eb469c056b49a572c70d4 /sql/table.cc | |
parent | 2f74974b05a3f7469c0faebea9a157839dc0e4a6 (diff) | |
download | mariadb-git-f6a8ec5f925ec7d37d2858c5799b7a91a95accca.tar.gz |
"Fix" for BUG #2050 "10 to 1 performance drop with server 4.1.1".
Actually it is not a bug but right behavior observed as pefomance
degradation after we have forced Item_field::fix_fields() to
re-execute each time when we are executing prep stmt.
This patch implements small optimization which heals this bad
behavior. We are caching field position in TABLE::field array in
Item's member and are using this position for speeding up field
lookups in fix_fields() in case of its re-execution.
sql/item.cc:
Added cached_field_index member to Item_ident for caching field
position in TABLE::field array for quicker field lookup in case
fix_fields() is executed twice.
sql/item.h:
Added cached_field_index member to Item_ident for caching field
position in TABLE::field array for quicker field lookup in case
fix_fields() is executed twice.
sql/mysql_priv.h:
Now find_field_in_table has one more in-out parameter which is used
for caching field index in TABLE::field array stored for quicker
field look up.
sql/sql_acl.cc:
Now find_field_in_table has one more in-out parameter which is used
for caching field index in TABLE::field array stored for quicker
field look up.
sql/sql_base.cc:
Optimization: Now when we are looking up Field by its name we are
caching its position in TABLE::field array in Item_ident::cached_field_index,
so when we will call fix_fields() second time for this item (e.g.
when we are re-executing prep statement) we can reuse this index
to speed up this lookup.
sql/table.cc:
Now we storing in TABLE::name_hash pointers to elements of
TABLE::field array, because this allows easily retrieve index
of field in this array when it is looked up by its name.
sql/table.h:
Added comment claryfying what we store in TABLE::name_hash.
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sql/table.cc b/sql/table.cc index 526810de74a..dcd0d39d855 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -30,11 +30,11 @@ static void fix_type_pointers(const char ***array, TYPELIB *point_to_type, static uint find_field(TABLE *form,uint start,uint length); -static byte* get_field_name(Field *buff,uint *length, +static byte* get_field_name(Field **buff,uint *length, my_bool not_used __attribute__((unused))) { - *length= (uint) strlen(buff->field_name); - return (byte*) buff->field_name; + *length= (uint) strlen((*buff)->field_name); + return (byte*) (*buff)->field_name; } /* @@ -479,7 +479,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (outparam->timestamp_field == reg_field) outparam->timestamp_field_offset=i; if (use_hash) - (void) my_hash_insert(&outparam->name_hash,(byte*) *field_ptr); // Will never fail + (void) my_hash_insert(&outparam->name_hash,(byte*) field_ptr); // Will never fail } *field_ptr=0; // End marker |