From f6a8ec5f925ec7d37d2858c5799b7a91a95accca Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 28 Mar 2004 04:11:54 +0400 Subject: "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 --- sql/table.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sql/table.h') diff --git a/sql/table.h b/sql/table.h index c027e2ccc44..039e3ded9f3 100644 --- a/sql/table.h +++ b/sql/table.h @@ -65,7 +65,8 @@ struct st_table { handler *file; Field **field; /* Pointer to fields */ Field_blob **blob_field; /* Pointer to blob fields */ - HASH name_hash; /* hash of field names */ + /* hash of field names (contains pointers to elements of field array) */ + HASH name_hash; byte *record[2]; /* Pointer to records */ byte *default_values; /* Default values for INSERT */ byte *insert_values; /* used by INSERT ... UPDATE */ -- cgit v1.2.1