mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-33087 ALTER TABLE...ALGORITHM=COPY should build indexes more efficiently
- During copy algorithm, InnoDB should use bulk insert operation for row by row insert operation. By doing this, copy algorithm can effectively build indexes. This optimization is disabled for temporary table, versioning table and table which has foreign key relation. Introduced the variable innodb_alter_copy_bulk to allow the bulk insert operation for copy alter operation inside InnoDB. This is enabled by default ha_innobase::extra(): HA_EXTRA_END_ALTER_COPY mode tries to apply the buffered bulk insert operation, updates the non-persistent table stats. row_merge_bulk_t::write_to_index(): Update stat_n_rows after applying the bulk insert operation row_ins_clust_index_entry_low(): In case of copy algorithm, switch to bulk insert operation. copy_data_error_ignore(): Handles the error while copying the data from source to target file.
This commit is contained in:
@ -4356,7 +4356,16 @@ bool select_insert::prepare_eof()
|
||||
if (info.ignore || info.handle_duplicates != DUP_ERROR)
|
||||
if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
|
||||
table->file->ha_rnd_end();
|
||||
table->file->extra(HA_EXTRA_END_ALTER_COPY);
|
||||
if (error <= 0)
|
||||
{
|
||||
error= table->file->extra(HA_EXTRA_END_ALTER_COPY);
|
||||
if (error == HA_ERR_FOUND_DUPP_KEY)
|
||||
{
|
||||
uint key_nr= table->file->get_dup_key(error);
|
||||
if ((int)key_nr >= 0 && key_nr < table->s->keys)
|
||||
print_keydup_error(table, &table->key_info[key_nr], MYF(0));
|
||||
}
|
||||
}
|
||||
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
|
||||
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
|
||||
|
||||
|
Reference in New Issue
Block a user