diff options
author | Mikael Ronstrom <mikael@mysql.com> | 2009-09-10 11:14:23 +0200 |
---|---|---|
committer | Mikael Ronstrom <mikael@mysql.com> | 2009-09-10 11:14:23 +0200 |
commit | 52d9a4d3d660d9b90e6523eb05a1be4cd9f0607c (patch) | |
tree | a07ecab3eed8df511ed29a97f6e6ee06288391b4 | |
parent | 905d715f10e711860311e0a10488c6bb5e19ee49 (diff) | |
download | mariadb-git-52d9a4d3d660d9b90e6523eb05a1be4cd9f0607c.tar.gz |
WL#4571, Enable Key cache defined for a partition to enable more scalability on partitioned MyISAM tables among other things
-rwxr-xr-x | BUILD/build_mccge.sh | 2 | ||||
-rw-r--r-- | sql/ha_partition.cc | 58 | ||||
-rw-r--r-- | sql/ha_partition.h | 5 | ||||
-rw-r--r-- | sql/partition_element.h | 3 | ||||
-rw-r--r-- | sql/sql_partition.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 83 |
7 files changed, 130 insertions, 24 deletions
diff --git a/BUILD/build_mccge.sh b/BUILD/build_mccge.sh index ad3e728453c..379ca1b2c68 100755 --- a/BUILD/build_mccge.sh +++ b/BUILD/build_mccge.sh @@ -556,7 +556,7 @@ parse_package() package="pro" ;; extended ) - package="" + package="extended" ;; cge ) package="cge" diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index ac8c46ec4e3..dc5ce9f4bdc 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -847,9 +847,12 @@ int ha_partition::rename_partitions(const char *path) #define ANALYZE_PARTS 2 #define CHECK_PARTS 3 #define REPAIR_PARTS 4 +#define ASSIGN_KEYCACHE_PARTS 5 +#define PRELOAD_KEYS_PARTS 6 static const char *opt_op_name[]= {NULL, - "optimize", "analyze", "check", "repair" }; + "optimize", "analyze", "check", "repair", + "assign_to_keycache", "preload_keys"}; /* Optimize table @@ -934,7 +937,44 @@ int ha_partition::repair(THD *thd, HA_CHECK_OPT *check_opt) DBUG_RETURN(handle_opt_partitions(thd, check_opt, REPAIR_PARTS)); } +/** + Assign to keycache + + @param thd Thread object + @param check_opt Check/analyze/repair/optimize options + + @return + @retval >0 Error + @retval 0 Success +*/ + +int ha_partition::assign_to_keycache(THD *thd, HA_CHECK_OPT *check_opt) +{ + DBUG_ENTER("ha_partition::assign_to_keycache"); + + DBUG_RETURN(handle_opt_partitions(thd, check_opt, ASSIGN_KEYCACHE_PARTS)); +} + + +/** + Preload to keycache + @param thd Thread object + @param check_opt Check/analyze/repair/optimize options + + @return + @retval >0 Error + @retval 0 Success +*/ + +int ha_partition::preload_keys(THD *thd, HA_CHECK_OPT *check_opt) +{ + DBUG_ENTER("ha_partition::preload_keys"); + + DBUG_RETURN(handle_opt_partitions(thd, check_opt, PRELOAD_KEYS_PARTS)); +} + + /* Handle optimize/analyze/check/repair of one partition @@ -965,6 +1005,10 @@ static int handle_opt_part(THD *thd, HA_CHECK_OPT *check_opt, error= file->ha_check(thd, check_opt); else if (flag == REPAIR_PARTS) error= file->ha_repair(thd, check_opt); + else if (flag == ASSIGN_KEYCACHE_PARTS) + error= file->assign_to_keycache(thd, check_opt); + else if (flag == PRELOAD_KEYS_PARTS) + error= file->preload_keys(thd, check_opt); else { DBUG_ASSERT(FALSE); @@ -1094,6 +1138,12 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, "Subpartition %s returned error", sub_elem->partition_name); } + /* reset part_state for the remaining partitions */ + do + { + if (part_elem->part_state == PART_ADMIN) + part_elem->part_state= PART_NORMAL; + } while (part_elem= part_it++); DBUG_RETURN(error); } } while (++j < no_subparts); @@ -1120,6 +1170,12 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, opt_op_name[flag], "Partition %s returned error", part_elem->partition_name); } + /* reset part_state for the remaining partitions */ + do + { + if (part_elem->part_state == PART_ADMIN) + part_elem->part_state= PART_NORMAL; + } while (part_elem= part_it++); DBUG_RETURN(error); } } diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 8a81a759e2a..2f0ce6e7910 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -1061,12 +1061,13 @@ public: virtual int backup(TD* thd, HA_CHECK_OPT *check_opt); virtual int restore(THD* thd, HA_CHECK_OPT *check_opt); - virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt); - virtual int preload_keys(THD *thd, HA_CHECK_OPT *check_opt); virtual int dump(THD* thd, int fd = -1); virtual int net_read_dump(NET* net); virtual uint checksum() const; */ + /* Enabled keycache for performance reasons, WL#4571 */ + virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt); + virtual int preload_keys(THD* thd, HA_CHECK_OPT* check_opt); /* ------------------------------------------------------------------------- diff --git a/sql/partition_element.h b/sql/partition_element.h index 905bc38165b..bede5264c71 100644 --- a/sql/partition_element.h +++ b/sql/partition_element.h @@ -32,7 +32,8 @@ enum partition_state { PART_REORGED_DROPPED= 5, PART_CHANGED= 6, PART_IS_CHANGED= 7, - PART_IS_ADDED= 8 + PART_IS_ADDED= 8, + PART_ADMIN= 9 }; /* diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 61766e5c509..1c109362a0b 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4151,7 +4151,7 @@ uint set_part_state(Alter_info *alter_info, partition_info *tab_part_info, /* Mark the partition. I.e mark the partition as a partition to be "changed" by - analyzing/optimizing/rebuilding/checking/repairing + analyzing/optimizing/rebuilding/checking/repairing/... */ no_parts_found++; part_elem->part_state= part_state; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 81d00f46000..9b8c23ce5e9 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4521,6 +4521,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, /* Set up which partitions that should be processed if ALTER TABLE t ANALYZE/CHECK/OPTIMIZE/REPAIR PARTITION .. + CACHE INDEX/LOAD INDEX for specified partitions */ Alter_info *alter_info= &lex->alter_info; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 4ed9946a334..54458c53570 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1261,7 +1261,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); slave master_def master_defs master_file_def slave_until_opts repair restore backup analyze check start checksum field_list field_list_item field_spec kill column_def key_def - keycache_list assign_to_keycache preload_list preload_keys + keycache_list keycache_list_or_parts assign_to_keycache + assign_to_keycache_parts + preload_list preload_list_or_parts preload_keys preload_keys_parts select_item_list select_item values_list no_braces opt_limit_clause delete_limit_clause fields opt_values values procedure_list procedure_list2 procedure_item @@ -3747,17 +3749,9 @@ opt_partitioning: ; partitioning: - PARTITION_SYM + PARTITION_SYM have_partitioning { -#ifdef WITH_PARTITION_STORAGE_ENGINE LEX *lex= Lex; - LEX_STRING partition_name={C_STRING_WITH_LEN("partition")}; - if (!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN)) - { - my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), - "--skip-partition"); - MYSQL_YYABORT; - } lex->part_info= new partition_info(); if (!lex->part_info) { @@ -3768,14 +3762,27 @@ partitioning: { lex->alter_info.flags|= ALTER_PARTITION; } + } + partition + ; + +have_partitioning: + /* empty */ + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX_STRING partition_name={C_STRING_WITH_LEN("partition")}; + if (!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN)) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition"); + MYSQL_YYABORT; + } #else - my_error(ER_FEATURE_DISABLED, MYF(0), - "partitioning", "--with-partition"); + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition"); MYSQL_YYABORT; #endif - } - partition ; partition_entry: @@ -5437,7 +5444,6 @@ alter: if (!lex->select_lex.add_table_to_list(thd, $4, NULL, TL_OPTION_UPDATING)) MYSQL_YYABORT; - lex->alter_info.reset(); lex->col_list.empty(); lex->select_lex.init_order(); lex->select_lex.db= @@ -6296,14 +6302,23 @@ table_to_table: ; keycache: - CACHE_SYM INDEX_SYM keycache_list IN_SYM key_cache_name + CACHE_SYM INDEX_SYM + { + Lex->alter_info.reset(); + } + keycache_list_or_parts IN_SYM key_cache_name { LEX *lex=Lex; lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; - lex->ident= $5; + lex->ident= $6; } ; +keycache_list_or_parts: + keycache_list + | assign_to_keycache_parts + ; + keycache_list: assign_to_keycache | keycache_list ',' assign_to_keycache @@ -6318,6 +6333,15 @@ assign_to_keycache: } ; +assign_to_keycache_parts: + table_ident adm_partition cache_keys_spec + { + if (!Select->add_table_to_list(YYTHD, $1, NULL, 0, TL_READ, + Select->pop_index_hints())) + MYSQL_YYABORT; + } + ; + key_cache_name: ident { $$= $1; } | DEFAULT { $$ = default_key_cache_base; } @@ -6328,11 +6352,17 @@ preload: { LEX *lex=Lex; lex->sql_command=SQLCOM_PRELOAD_KEYS; + lex->alter_info.reset(); } - preload_list + preload_list_or_parts {} ; +preload_list_or_parts: + preload_keys_parts + | preload_list + ; + preload_list: preload_keys | preload_list ',' preload_keys @@ -6347,6 +6377,23 @@ preload_keys: } ; +preload_keys_parts: + table_ident adm_partition cache_keys_spec opt_ignore_leaves + { + if (!Select->add_table_to_list(YYTHD, $1, NULL, $4, TL_READ, + Select->pop_index_hints())) + MYSQL_YYABORT; + } + ; + +adm_partition: + PARTITION_SYM have_partitioning + { + Lex->alter_info.flags|= ALTER_ADMIN_PARTITION; + } + '(' all_or_alt_part_name_list ')' + ; + cache_keys_spec: { Lex->select_lex.alloc_index_hints(YYTHD); |