drop the indexes for the conversion then rebuild the indexes after the
tables are converted.

On Jan 29, 2008 4:08 PM, David Schneider-Joseph <[EMAIL PROTECTED]> wrote:

> Hi all,
>
> I am attempting to convert a very large table (~23 million rows) from
> MyISAM to InnoDB.  If I do it in chunks of one million at a time, the
> first million are very fast (approx. 3 minutes or so), and then it
> gets progressively worse, until by the time I get even to the fourth
> chunk, it's taking 15-20 minutes, and continuing to worsen.  This is
> much worse degradation than the O*log(N) that you would expect.
>
> I have determined that this is in part due to the indexes on the
> table.  I have an index on two columns, call them A and B.  There is
> no relationship between the ordering in A and the ordering in B.  If I
> create the InnoDB table with only index A, and insert the data into it
> in the order of A, then almost no gradual degradation in performance
> can be observed between chunks.  Similarly, if I create the InnoDB
> table with only index B, and insert the data ordered by B, it also
> maintains its performance.
>
> However, I have not been able find a way to insert the data with
> *both* indexes, A and B, without suffering this gradual degradation in
> performance.  I have tried all sorts of methods to convert the table,
> such as dumping to a file and importing back into an InnoDB table,
> using "ALTER TABLE big_table ENGINE=InnoDB;", importing the data
> without the second index and adding it after the fact, and in all
> cases it is just a game of whackamole, with the overhead being moved
> elsewhere.  (Note: my primary key is an integer column, so that is not
> the issue here.)
>
> This problem can even be reproduced in a very simple test case, where
> I continuously insert approximately 1 million rows into a table, with
> random data.  `big_table` can be any table with approximately one
> million rows in id range 1 through 1000000 (we're not actually using
> any data from it):
>
> > mysql> create table test (id int NOT NULL auto_increment, x int NOT
> > NULL, primary key (id), key (x)) ENGINE=InnoDB;
> > Query OK, 0 rows affected (0.08 sec)
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (22.23 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (37.03 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (56.41 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (1 min 8.47 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (1 min 27.67 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
> >
> > mysql> insert into test (x) select cast(rand()*10000000 as unsigned)
> > from big_table where id between 1 and 1000000;
> > Query OK, 981734 rows affected (1 min 57.93 sec)
> > Records: 981734  Duplicates: 0  Warnings: 0
>
> Any ideas, anyone?
>
> Thanks,
> David
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:
> http://lists.mysql.com/[EMAIL PROTECTED]
>
>


-- 
We are all slave to our own paradigm. -- Joshua Williams

If the letters PhD appear after a person's name, that person will remain
outdoors even after it's started raining. -- Jeff Kay

Reply via email to