summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2002-11-20 22:56:57 +0200
committerunknown <monty@mashka.mysql.fi>2002-11-20 22:56:57 +0200
commit9b9546edbc095e061167588f672549103627bf98 (patch)
tree1deb846a75b9e1e5c1491e20df66b4d74fc6fa0b /sql
parent33d678fcdc2d0b431c0f08e11e0b6715cd37cda0 (diff)
downloadmariadb-git-9b9546edbc095e061167588f672549103627bf98.tar.gz
Try to optimize the cache buffer size needed for bulk_insert
Fix for shutdown on Mac OS X include/my_tree.h: Try to optimize the cache buffer size needed for bulk_insert myisam/mi_write.c: Try to optimize the cache buffer size needed for bulk_insert mysql-test/r/bdb.result: Make test repeatable mysql-test/t/bdb.test: Make test repeatable mysys/tree.c: Try to optimize the cache buffer size needed for bulk_insert sql/mysql_priv.h: Small optimization sql/mysqld.cc: Fix for shutdown on Mac OS X sql/sql_insert.cc: Try to optimize the cache buffer size needed for bulk_insert sql/sql_yacc.yy: Call thd->strmake() instead of sql_strmake() sql/table.cc: Try to optimize the cache buffer size needed for bulk_insert sql/table.h: Try to optimize the cache buffer size needed for bulk_insert
Diffstat (limited to 'sql')
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/mysqld.cc21
-rw-r--r--sql/sql_insert.cc10
-rw-r--r--sql/sql_yacc.yy9
-rw-r--r--sql/table.cc3
-rw-r--r--sql/table.h1
6 files changed, 36 insertions, 11 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index db457aa0aa7..43de81cae00 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -83,6 +83,7 @@ char* query_table_status(THD *thd,const char *db,const char *table_name);
*/
#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (16L*1024*1024)
#define MIN_ROWS_TO_USE_TABLE_CACHE 100
+#define MIN_ROWS_TO_USE_BULK_INSERT 100
/*
The following is used to decide if MySQL should use table scanning
@@ -707,7 +708,7 @@ bool wait_for_locked_table_names(THD *thd, TABLE_LIST *table_list);
/* old unireg functions */
void unireg_init(ulong options);
-void unireg_end(int signal);
+void unireg_end(void);
int rea_create_table(my_string file_name,HA_CREATE_INFO *create_info,
List<create_field> &create_field,
uint key_count,KEY *key_info);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 2404b35b00f..ffe3d1be47c 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -764,7 +764,7 @@ static void __cdecl kill_server(int sig_ptr)
if (sig != MYSQL_KILL_SIGNAL && sig != 0)
unireg_abort(1); /* purecov: inspected */
else
- unireg_end(0);
+ unireg_end();
pthread_exit(0); /* purecov: deadcode */
RETURN_FROM_KILL_SERVER;
}
@@ -803,12 +803,29 @@ extern "C" sig_handler print_signal_warning(int sig)
#endif
}
+/*
+ cleanup all memory and end program nicely
+
+ SYNOPSIS
+ unireg_end()
+
+ NOTES
+ This function never returns.
+
+ If SIGNALS_DONT_BREAK_READ is defined, this function is called
+ by the main thread. To get MySQL to shut down nicely in this case
+ (Mac OS X) we have to call exit() instead if pthread_exit().
+*/
-void unireg_end(int signal_number __attribute__((unused)))
+void unireg_end(void)
{
clean_up();
my_thread_end();
+#ifdef SIGNALS_DONT_BREAK_READ
+ exit(0);
+#else
pthread_exit(0); // Exit is in main thread
+#endif
}
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 71f570e4798..2508314c469 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -194,15 +194,19 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
thd->proc_info="update";
if (duplic == DUP_IGNORE || duplic == DUP_REPLACE)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
- if ((bulk_insert= (values_list.elements > 1 &&
+ if ((bulk_insert= (values_list.elements >= MIN_ROWS_TO_USE_BULK_INSERT &&
lock_type != TL_WRITE_DELAYED &&
!(specialflag & SPECIAL_SAFE_MODE))))
{
table->file->extra_opt(HA_EXTRA_WRITE_CACHE,
- thd->variables.read_buff_size);
+ min(thd->variables.read_buff_size,
+ table->avg_row_length*values_list.elements));
if (thd->variables.bulk_insert_buff_size)
table->file->extra_opt(HA_EXTRA_BULK_INSERT_BEGIN,
- thd->variables.bulk_insert_buff_size);
+ min(thd->variables.bulk_insert_buff_size,
+ (table->total_key_length +
+ table->keys * TREE_ELEMENT_EXTRA_SIZE)*
+ values_list.elements));
table->bulk_insert= 1;
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 92b49549a06..f6a0c483bb9 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3107,12 +3107,13 @@ ident:
IDENT { $$=$1; }
| keyword
{
- LEX *lex;
- $$.str=sql_strmake($1.str,$1.length);
+ LEX *lex= Lex;
+ $$.str= lex->thd->strmake($1.str,$1.length);
$$.length=$1.length;
- if ((lex=Lex)->next_state != STATE_END)
+ if (lex->next_state != STATE_END)
lex->next_state=STATE_OPERATOR_OR_IDENT;
- };
+ }
+ ;
ident_or_text:
ident { $$=$1;}
diff --git a/sql/table.cc b/sql/table.cc
index b68edac5fc2..62163819599 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -143,7 +143,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
goto err_not_open; /* purecov: inspected */
bzero((char*) keyinfo,n_length);
outparam->key_info=keyinfo;
- outparam->max_key_length=0;
+ outparam->max_key_length= outparam->total_key_length= 0;
key_part= (KEY_PART_INFO*) (keyinfo+keys);
strpos=disk_buff+6;
@@ -201,6 +201,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
}
set_if_bigger(outparam->max_key_length,keyinfo->key_length+
keyinfo->key_parts);
+ outparam->total_key_length+= keyinfo->key_length;
if (keyinfo->flags & HA_NOSAME)
set_if_bigger(outparam->max_unique_length,keyinfo->key_length);
}
diff --git a/sql/table.h b/sql/table.h
index ca86269b625..f998a0fd4e6 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -58,6 +58,7 @@ struct st_table {
uint reclength; /* Recordlength */
uint rec_buff_length;
uint keys,key_parts,primary_key,max_key_length,max_unique_length;
+ uint total_key_length;
uint uniques;
uint null_fields; /* number of null fields */
uint blob_fields; /* number of blob fields */