Commit 251fb37b authored by tim@work.mysql.com's avatar tim@work.mysql.com

Merge work.mysql.com:/home/bk/mysql into work.mysql.com:/home/tim/my/3

parents bbb40f5b fe9b9784
heikki@donna.mysql.fi
jani@hynda.mysql.fi jani@hynda.mysql.fi
jcole@tetra.spaceapes.com
tim@work.mysql.com tim@work.mysql.com
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -2351,6 +2351,7 @@ btr_estimate_n_rows_in_range( ...@@ -2351,6 +2351,7 @@ btr_estimate_n_rows_in_range(
btr_path_t* slot1; btr_path_t* slot1;
btr_path_t* slot2; btr_path_t* slot2;
ibool diverged; ibool diverged;
ulint divergence_level;
ulint n_rows; ulint n_rows;
ulint i; ulint i;
mtr_t mtr; mtr_t mtr;
...@@ -2393,6 +2394,7 @@ btr_estimate_n_rows_in_range( ...@@ -2393,6 +2394,7 @@ btr_estimate_n_rows_in_range(
n_rows = 1; n_rows = 1;
diverged = FALSE; diverged = FALSE;
divergence_level = 1000000;
for (i = 0; ; i++) { for (i = 0; ; i++) {
ut_ad(i < BTR_PATH_ARRAY_N_SLOTS); ut_ad(i < BTR_PATH_ARRAY_N_SLOTS);
...@@ -2403,6 +2405,13 @@ btr_estimate_n_rows_in_range( ...@@ -2403,6 +2405,13 @@ btr_estimate_n_rows_in_range(
if (slot1->nth_rec == ULINT_UNDEFINED if (slot1->nth_rec == ULINT_UNDEFINED
|| slot2->nth_rec == ULINT_UNDEFINED) { || slot2->nth_rec == ULINT_UNDEFINED) {
if (i > divergence_level + 1) {
/* In trees whose height is > 1 our algorithm
tends to underestimate: multiply the estimate
by 2: */
n_rows = n_rows * 2;
}
return(n_rows); return(n_rows);
} }
...@@ -2417,6 +2426,8 @@ btr_estimate_n_rows_in_range( ...@@ -2417,6 +2426,8 @@ btr_estimate_n_rows_in_range(
return(10); return(10);
} }
divergence_level = i;
diverged = TRUE; diverged = TRUE;
} else if (diverged) { } else if (diverged) {
n_rows = (n_rows * (slot1->n_recs + slot2->n_recs)) n_rows = (n_rows * (slot1->n_recs + slot2->n_recs))
......
...@@ -822,11 +822,11 @@ ha_innobase::open( ...@@ -822,11 +822,11 @@ ha_innobase::open(
if (NULL == (ib_table = dict_table_get(norm_name, NULL))) { if (NULL == (ib_table = dict_table_get(norm_name, NULL))) {
fprintf(stderr, "\ fprintf(stderr,
Cannot find table %s from the internal data dictionary\n\ "Cannot find table %s from the internal data dictionary\n"
of InnoDB though the .frm file for the table exists. Maybe you have deleted\n\ "of InnoDB though the .frm file for the table exists. Maybe you have deleted\n"
and created again an InnoDB database but forgotten to delete the\n\ "and created again an InnoDB database but forgotten to delete the\n"
corresponding .frm files of old InnoDB tables?\n", "corresponding .frm files of old InnoDB tables?\n",
norm_name); norm_name);
free_share(share); free_share(share);
...@@ -2659,6 +2659,37 @@ ha_innobase::records_in_range( ...@@ -2659,6 +2659,37 @@ ha_innobase::records_in_range(
DBUG_RETURN((ha_rows) n_rows); DBUG_RETURN((ha_rows) n_rows);
} }
/*************************************************************************
Gives an UPPER BOUND to the number of rows in a table. This is used in
filesort.cc and the upper bound must hold. TODO: Since the number of
rows in a table may change after this function is called, we still may
get a 'Sort aborted' error in filesort.cc of MySQL. The ultimate fix is to
improve the algorithm of filesort.cc. */
ha_rows
ha_innobase::estimate_number_of_rows(void)
/*======================================*/
/* out: upper bound of rows, currently 32-bit int
or uint */
{
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
dict_table_t* ib_table;
DBUG_ENTER("info");
ib_table = prebuilt->table;
dict_update_statistics(ib_table);
data_file_length = ((ulonglong)
ib_table->stat_clustered_index_size)
* UNIV_PAGE_SIZE;
/* The minimum clustered index record size is 20 bytes */
return((ha_rows) (1000 + data_file_length / 20));
}
/************************************************************************* /*************************************************************************
How many seeks it will take to read through the table. This is to be How many seeks it will take to read through the table. This is to be
comparable to the number returned by records_in_range so that we can comparable to the number returned by records_in_range so that we can
......
...@@ -137,6 +137,7 @@ class ha_innobase: public handler ...@@ -137,6 +137,7 @@ class ha_innobase: public handler
enum ha_rkey_function start_search_flag, enum ha_rkey_function start_search_flag,
const byte *end_key,uint end_key_len, const byte *end_key,uint end_key_len,
enum ha_rkey_function end_search_flag); enum ha_rkey_function end_search_flag);
ha_rows estimate_number_of_rows();
int create(const char *name, register TABLE *form, int create(const char *name, register TABLE *form,
HA_CREATE_INFO *create_info); HA_CREATE_INFO *create_info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment