diff --git a/CMakeLists.txt b/CMakeLists.txt
index 96f251e9553..f39e95b5466 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,7 +40,7 @@ SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
 
 # MAX_INDEXES - Set the maximum number of indexes per table, default 64
 IF (NOT MAX_INDEXES)
-  SET(MAX_INDEXES 64)
+  SET(MAX_INDEXES 64 CACHE STRING "Max number of indexes")
 ENDIF(NOT MAX_INDEXES)
 
 IF (${MAX_INDEXES} GREATER 128)
diff --git a/sql/mysqld.h b/sql/mysqld.h
index b8c6e5f79bb..ddb3f23bcd0 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -41,15 +41,7 @@ struct scheduler_functions;
 
 typedef struct st_mysql_show_var SHOW_VAR;
 
-#if MAX_INDEXES <= 64
-typedef Bitmap<64>  key_map;          /* Used for finding keys */
-#elif MAX_INDEXES > 128
-#error "MAX_INDEXES values greater than 128 is not supported."
-#else
-typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
-#endif
-
-	/* Bits from testflag */
+/* Bits from testflag */
 #define TEST_PRINT_CACHED_TABLES 1U
 #define TEST_NO_KEY_GROUP	 2U
 #define TEST_MIT_THREAD		4U
diff --git a/sql/sql_bitmap.h b/sql/sql_bitmap.h
index 705a8d169e1..a2b1383ef70 100644
--- a/sql/sql_bitmap.h
+++ b/sql/sql_bitmap.h
@@ -224,5 +224,12 @@ template <> class Bitmap<64>
   }
 };
 
+#if MAX_INDEXES <= 64
+typedef Bitmap<64>  key_map;          /* Used for finding keys */
+#elif MAX_INDEXES > 128
+#error "MAX_INDEXES values greater than 128 is not supported."
+#else
+typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
+#endif
 
 #endif /* SQL_BITMAP_INCLUDED */
diff --git a/sql/structs.h b/sql/structs.h
index 743dee66c57..48de99ddced 100644
--- a/sql/structs.h
+++ b/sql/structs.h
@@ -29,14 +29,6 @@
 #include <mysql_com.h>                  /* USERNAME_LENGTH */
 #include "sql_bitmap.h"
 
-#if MAX_INDEXES <= 64
-typedef Bitmap<64>  key_map;          /* Used for finding keys */
-#elif MAX_INDEXES > 128
-#error "MAX_INDEXES values greater than 128 is not supported."
-#else
-typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
-#endif
-
 struct TABLE;
 class Type_handler;
 class Field;
diff --git a/sql/table.cc b/sql/table.cc
index f605ebf9d31..df07708bc30 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -796,6 +796,8 @@ static bool create_key_infos(const uchar *strpos, const uchar *frm_image_end,
 
     keyinfo->key_part=	 key_part;
     keyinfo->rec_per_key= rec_per_key;
+    keyinfo->overlapped.init();
+    keyinfo->constraint_correlated.init();
     for (j=keyinfo->user_defined_key_parts ; j-- ; key_part++)
     {
       if (strpos + (new_frm_ver >= 1 ? 9 : 7) >= frm_image_end)
@@ -3683,7 +3685,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
   /* Fix key->name and key_part->field */
   if (share->key_parts)
   {
-    KEY	*key_info, *key_info_end;
+    KEY	*key_info;
     KEY_PART_INFO *key_part;
     uint n_length;
     n_length= share->keys*sizeof(KEY) + share->ext_key_parts*sizeof(KEY_PART_INFO);
@@ -3692,16 +3694,14 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
     outparam->key_info= key_info;
     key_part= (reinterpret_cast<KEY_PART_INFO*>(key_info+share->keys));
 
-    memcpy(key_info, share->key_info, sizeof(*key_info)*share->keys);
     memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
                                                    share->ext_key_parts));
 
-    for (key_info_end= key_info + share->keys ;
-         key_info < key_info_end ;
-         key_info++)
+    for (uint i=0; i < share->keys ; i++, key_info++)
     {
       KEY_PART_INFO *key_part_end;
 
+      *key_info= share->key_info[i];
       key_info->table= outparam;
       key_info->key_part= key_part;
 
@@ -7428,8 +7428,8 @@ void TABLE::restore_blob_values(String *blob_storage)
 bool TABLE::alloc_keys(uint key_count)
 {
   key_info= (KEY*) alloc_root(&mem_root, sizeof(KEY)*(s->keys+key_count));
-  if (s->keys)
-    memmove(key_info, s->key_info, sizeof(KEY)*s->keys);
+  for (uint i=0; i < s->keys; i++)
+    key_info[i]= s->key_info[i];
   s->key_info= key_info;
   max_keys= s->keys+key_count;
   return !(key_info);
@@ -7661,7 +7661,7 @@ void TABLE::use_index(int key_to_save)
   DBUG_ASSERT(!created && key_to_save < (int)s->keys);
   if (key_to_save >= 0)
     /* Save the given key. */
-    memmove(key_info, key_info + key_to_save, sizeof(KEY));
+    key_info[0] = key_info[key_to_save];
   else
     /* Drop all keys; */
     i= 0;
diff --git a/storage/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp
index 0f153e200ef..efc661df7c0 100644
--- a/storage/mroonga/ha_mroonga.cpp
+++ b/storage/mroonga/ha_mroonga.cpp
@@ -14578,8 +14578,8 @@ enum_alter_inplace_result ha_mroonga::wrapper_check_if_supported_inplace_alter(
     if (key->flags & HA_FULLTEXT || mrn_is_geo_key(key)) {
       result_mroonga = HA_ALTER_INPLACE_EXCLUSIVE_LOCK;
     } else {
-      memcpy(&alter_index_drop_buffer[alter_index_drop_count],
-        ha_alter_info->index_drop_buffer[i], sizeof(KEY));
+      alter_index_drop_buffer[alter_index_drop_count] =
+        *ha_alter_info->index_drop_buffer[i];
       ++alter_index_drop_count;
     }
   }
@@ -14606,12 +14606,12 @@ enum_alter_inplace_result ha_mroonga::wrapper_check_if_supported_inplace_alter(
   for (i = 0; i < n_keys; ++i) {
     const KEY *key = &altered_table->key_info[i];
     if (!(key->flags & HA_FULLTEXT || mrn_is_geo_key(key))) {
-      memcpy(&alter_key_info_buffer[alter_key_count],
-             &ha_alter_info->key_info_buffer[i], sizeof(KEY));
-      memcpy(&wrap_altered_table_key_info[alter_key_count],
-             &altered_table->key_info[i], sizeof(KEY));
-      memcpy(&wrap_altered_table_share_key_info[alter_key_count],
-             &altered_table->s->key_info[i], sizeof(KEY));
+      alter_key_info_buffer[alter_key_count] =
+             ha_alter_info->key_info_buffer[i];
+      wrap_altered_table_key_info[alter_key_count] =
+             altered_table->key_info[i];
+      wrap_altered_table_share_key_info[alter_key_count] =
+             altered_table->s->key_info[i];
       if (add_index_pos < alter_index_add_count &&
              alter_index_add_buffer[add_index_pos] == i) {
         alter_index_add_buffer[add_index_pos] = alter_key_count;
diff --git a/storage/mroonga/mrn_table.cpp b/storage/mroonga/mrn_table.cpp
index 17831bbda61..bd56bc2f874 100644
--- a/storage/mroonga/mrn_table.cpp
+++ b/storage/mroonga/mrn_table.cpp
@@ -908,8 +908,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
           !mrn_is_geo_key(&table->s->key_info[i]))
         {
           wrap_key_nr[i] = j;
-          memcpy(&wrap_key_info[j], &table->s->key_info[i],
-                 sizeof(*wrap_key_info));
+          wrap_key_info[j]= table->s->key_info[i];
           j++;
         } else {
           wrap_key_nr[i] = MAX_KEY;
@@ -932,7 +931,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
         share->wrap_key_info = NULL;
         share->wrap_primary_key = MAX_KEY;
       }
-      memcpy(wrap_table_share, table->s, sizeof(*wrap_table_share));
+      *wrap_table_share= *table->s;
       mrn_init_sql_alloc(current_thd, &(wrap_table_share->mem_root));
       wrap_table_share->keys = share->wrap_keys;
       wrap_table_share->key_info = share->wrap_key_info;
@@ -1114,8 +1113,7 @@ KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error)
       j = wrap_key_nr[i];
       if (j < MAX_KEY)
       {
-        memcpy(&wrap_key_info[j], &table->key_info[i],
-               sizeof(*wrap_key_info));
+        wrap_key_info[j] = table->key_info[i];
       }
     }
   } else
