diff --git a/sql/sql_class.cc b/sql/sql_class.cc index ba7e0654331..0db3ea22c78 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1188,11 +1188,11 @@ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var) *(to++)+= *(from++); /* Handle the not ulong variables. See end of system_status_var */ - to_var->bytes_received= from_var->bytes_received; + to_var->bytes_received+= from_var->bytes_received; to_var->bytes_sent+= from_var->bytes_sent; to_var->rows_read+= from_var->rows_read; to_var->rows_sent+= from_var->rows_sent; - to_var->binlog_bytes_written= from_var->binlog_bytes_written; + to_var->binlog_bytes_written+= from_var->binlog_bytes_written; to_var->cpu_time+= from_var->cpu_time; to_var->busy_time+= from_var->busy_time; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 287f08bad44..9d2298e4675 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -11009,10 +11009,21 @@ static bool create_internal_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, OPTION_BIG_TABLES) create_info.data_file_length= ~(ulonglong) 0; + /* + The logic for choosing the record format: + The STATIC_RECORD format is the fastest one, because it's so simple, + so we use this by default for short rows. + BLOCK_RECORD caches both row and data, so this is generally faster than + DYNAMIC_RECORD. The one exception is when we write to tmp table + (no updates == no sum fields) in which case BLOCK RECORD is slower as + we first write the row, then check for key conflicts and then we have to + delete the row. + */ if ((error= maria_create(share->table_name.str, - share->reclength < 64 && - !share->blob_fields ? STATIC_RECORD : - BLOCK_RECORD, + (share->reclength < 64 && + !share->blob_fields ? STATIC_RECORD : + !param->sum_func_count ? DYNAMIC_RECORD : + BLOCK_RECORD), share->keys, &keydef, (uint) (param->recinfo-param->start_recinfo), param->start_recinfo,