diff options
-rw-r--r-- | myisam/mi_check.c | 20 | ||||
-rw-r--r-- | myisam/mi_write.c | 4 | ||||
-rw-r--r-- | myisam/myisamdef.h | 1 | ||||
-rw-r--r-- | sql/ha_myisam.cc | 33 | ||||
-rw-r--r-- | sql/sql_load.cc | 1 | ||||
-rw-r--r-- | sql/table.h | 4 |
6 files changed, 26 insertions, 37 deletions
diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 433724a21e6..d25ffeedff0 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -3966,18 +3966,18 @@ static my_bool mi_too_big_key_for_sort(MI_KEYDEF *key, ha_rows rows) void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows) { MYISAM_SHARE *share=info->s; - uint i; - if (!info->state->records) /* Don't do this if old rows */ + MI_KEYDEF *key=share->keyinfo; + uint i; + + DBUG_ASSERT(info->state->records == 0 && + (!rows || rows >= MI_MIN_ROWS_TO_DISABLE_INDEXES)); + for (i=0 ; i < share->base.keys ; i++,key++) { - MI_KEYDEF *key=share->keyinfo; - for (i=0 ; i < share->base.keys ; i++,key++) + if (!(key->flag & (HA_NOSAME | HA_SPATIAL | HA_AUTO_KEY)) && + ! mi_too_big_key_for_sort(key,rows) && info->s->base.auto_key != i+1) { - if (!(key->flag & (HA_NOSAME | HA_SPATIAL | HA_AUTO_KEY)) && - ! mi_too_big_key_for_sort(key,rows) && info->s->base.auto_key != i+1) - { - share->state.key_map&= ~ ((ulonglong) 1 << i); - info->update|= HA_STATE_CHANGED; - } + share->state.key_map&= ~ ((ulonglong) 1 << i); + info->update|= HA_STATE_CHANGED; } } } diff --git a/myisam/mi_write.c b/myisam/mi_write.c index 382fb1156cb..59819b40f96 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -916,8 +916,8 @@ int mi_init_bulk_insert(MI_INFO *info, ulong cache_size, ha_rows rows) DBUG_ENTER("_mi_init_bulk_insert"); DBUG_PRINT("enter",("cache_size: %lu", cache_size)); - if (info->bulk_insert || (rows && rows < MI_MIN_ROWS_TO_USE_BULK_INSERT)) - DBUG_RETURN(0); + DBUG_ASSERT(!info->bulk_insert && + (!rows || rows >= MI_MIN_ROWS_TO_USE_BULK_INSERT)); for (i=total_keylength=num_keys=0 ; i < share->base.keys ; i++) { diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index f84d1c573d0..ecef9953202 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -416,6 +416,7 @@ typedef struct st_mi_sort_param #define MI_MIN_SIZE_BULK_INSERT_TREE 16384 /* this is per key */ #define MI_MIN_ROWS_TO_USE_BULK_INSERT 100 +#define MI_MIN_ROWS_TO_DISABLE_INDEXES 100 /* The UNIQUE check is done with a hashed long key */ diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index a2a5f040081..0e0c224419f 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -818,26 +818,19 @@ int ha_myisam::preload_keys(THD* thd, HA_CHECK_OPT *check_opt) deactivate_non_unique_index() rows Rows to be inserted 0 if we don't know - HA_POS_ERROR if we want to disable all keys + HA_POS_ERROR if we want to force disabling + and make it permanent (save on disk) */ void ha_myisam::deactivate_non_unique_index(ha_rows rows) { MYISAM_SHARE* share = file->s; - bool do_warning=0; if (share->state.key_map == ((ulonglong) 1L << share->base.keys)-1) { if (!(specialflag & SPECIAL_SAFE_MODE)) { - if (rows == HA_POS_ERROR) - { - uint orig_update= file->update; - file->update ^= HA_STATE_CHANGED; - uint check_update= file->update; + if (rows == HA_POS_ERROR) // force disable and save it on disk! mi_extra(file, HA_EXTRA_NO_KEYS, 0); - do_warning= (file->update == check_update) && file->state->records; - file->update= orig_update; - } else { /* @@ -847,15 +840,16 @@ void ha_myisam::deactivate_non_unique_index(ha_rows rows) we don't want to update the key statistics based of only a few rows. */ if (file->state->records == 0 && - (!rows || rows >= MI_MIN_ROWS_TO_USE_BULK_INSERT)) + (!rows || rows >= MI_MIN_ROWS_TO_DISABLE_INDEXES)) mi_disable_non_unique_index(file,rows); else + if (!file->bulk_insert && + (!rows || rows >= MI_MIN_ROWS_TO_USE_BULK_INSERT)) { mi_init_bulk_insert(file, - current_thd->variables.bulk_insert_buff_size, - rows); - table->bulk_insert= 1; - } + current_thd->variables.bulk_insert_buff_size, + rows); + } } } enable_activate_all_index=1; @@ -863,10 +857,6 @@ void ha_myisam::deactivate_non_unique_index(ha_rows rows) } else enable_activate_all_index=0; - if (do_warning) - push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA, - ER(ER_ILLEGAL_HA), table->table_name); } @@ -878,7 +868,6 @@ bool ha_myisam::activate_all_index(THD *thd) DBUG_ENTER("activate_all_index"); mi_end_bulk_insert(file); - table->bulk_insert= 0; if (enable_activate_all_index && share->state.key_map != set_bits(ulonglong, share->base.keys)) { @@ -1393,8 +1382,8 @@ longlong ha_myisam::get_auto_increment() return auto_increment_value; } - if (table->bulk_insert) - mi_flush_bulk_insert(file, table->next_number_index); + /* it's safe to call the following if bulk_insert isn't on */ + mi_flush_bulk_insert(file, table->next_number_index); longlong nr; int error; diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 58a9b9c588d..5118b063fb8 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -280,7 +280,6 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, table->next_number_field=table->found_next_number_field; VOID(table->file->extra_opt(HA_EXTRA_WRITE_CACHE, thd->variables.read_buff_size)); - table->bulk_insert= 1; if (handle_duplicates == DUP_IGNORE || handle_duplicates == DUP_REPLACE) table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); diff --git a/sql/table.h b/sql/table.h index 039e3ded9f3..992d316297a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -109,7 +109,7 @@ struct st_table { my_bool maybe_null,outer_join; /* Used with OUTER JOIN */ my_bool force_index; my_bool distinct,const_table,no_rows; - my_bool key_read, bulk_insert; + my_bool key_read; my_bool crypted; my_bool db_low_byte_first; /* Portable row format */ my_bool locked_by_flush; @@ -119,7 +119,7 @@ struct st_table { my_bool is_view; my_bool no_keyread, no_cache; my_bool clear_query_id; /* To reset query_id for tables and cols */ - my_bool auto_increment_field_not_null; + my_bool auto_increment_field_not_null; Field *next_number_field, /* Set if next_number is activated */ *found_next_number_field, /* Set on open */ *rowid_field; |