LOAD DATA INFILE, CREATE TABLE ... SELECT and INSERT ... SELECT should estimate the number of rows to be inserted in the table and call start_bulk_insert() with this number. For LOAD DATA INFILE one can do this with: file_length / (min-length-of-packed-row) For CREATE TABLE ...SELECT and INSERT ... SELECT this means that this should be done in ::initialize_tables() instead of in ::prepare() as we in the later case have an idea of how many rows there could be in the result set. (Can be stored in join->number_of_records, in sql_select.cc::find_best(), when we update join->best_read) Also, start_bulk_insert() now disables indexes only if there are no rows in the table, otherwise bulk_insert_tree is used. In fact, indexes could be disabled even when table is not empty, if it will give a speedup.