There is a huge difference !!! When You Load a Table with a Primary Key, the Primary get built automatically. Not even ALTER TABLE <tbl-name> DISABLE KEYS has an effect since it disables non-unique indexes. Hence, loading the table is a one-pass operation.
In contrast, loading a table with two non-unique indexes in the way you specified has the following effect: Your first statement: create index index_name1 on table_name (/|index_col_name|/1); This will make a temp table, copy the data from your table to the temp table, then build index_name1 on the temp table. Finally it renames the temp table to your table. Your second statement: create index index_name2 on table_name (/|index_col_name|/2); This will make a temp table, copy the data from your table to the temp table, then build index_name1 AND index_name2 on the temp table. Finally, it renames the temp table to your table. It copies the whole table twice. Notice, it build indexes thrice (3 times) not twice. Here is a chart that shows how many index builds would occur it you built indexes one at a time: Indexes Temp Table Loads Index Builds ------- ---------------- ------------ 1 1 1 2 2 3 3 3 4 4 4 10 5 5 15 6 6 21 7 7 28 8 8 36 9 9 45 10 10 55 11 11 66 12 12 78 13 13 91 14 14 105 15 15 120 16 16 136 17 17 153 N N N(N+1)/2 Building indexes one at a time, and non-unique indexes especially, is very inefficient. If you have non-unique indexes in your table, disable the keys first. Here is an example: CREATE TABLE t1 ( A INT NOT NULL PRIMARY KEY, B INT, C INT ); ALTER TABLE t1 ADD INDEX index_name1 (B); ALTER TABLE t1 ADD INDEX index_name2 (C); ALTER TABLE t1 DISABLE KEYS; -- Shuts off non-unique indexes <Load data into t1> -- Primary Key is Loaded ALTER TABLE t1 ENABLE KEYS; -- Non-unique indexes are loaded linearly This is how mysqldumps are reloaded. Just do a mysqldump of a small table and look at the code it generates for any one table. Here is a sample mysqldump: -- -- Table structure for table `contact` -- DROP TABLE IF EXISTS `contact`; CREATE TABLE `contact` ( `sno` int(11) NOT NULL auto_increment, `Name` varchar(50) default NULL, `mobile` varchar(20) default NULL, `email` varchar(100) default NULL, `companyname` varchar(100) default NULL, `newsletterflag` tinyint(4) default NULL, `smsflag` tinyint(4) default NULL, `createdatetime` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`sno`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; -- -- Dumping data for table `contact` -- LOCK TABLES `contact` WRITE; /*!40000 ALTER TABLE `contact` DISABLE KEYS */; INSERT INTO `contact` VALUES (1,'[EMAIL PROTECTED]','6421510248','Srinivasa Rao Munagala','THL INDIA ',1,NULL,'2007-11-08 21:48:36'); /*!40000 ALTER TABLE `contact` ENABLE KEYS */; UNLOCK TABLES; Your best bet is the disable keys, load the data, and enable keys. Here is a direct quotation from http://dev.mysql.com/doc/refman/5.0/en/alter-table.html If you use ALTER TABLE on a MyISAM table, all non-unique indexes are created in a separate batch (as for REPAIR TABLE). This should make ALTER TABLE much faster when you have many indexes. This feature can be activated explicitly for a MyISAM table. ALTER TABLE ... DISABLE KEYS tells MySQL to stop updating non-unique indexes. ALTER TABLE ... ENABLE KEYS then should be used to re-create missing indexes. MySQL does this with a special algorithm that is much faster than inserting keys one by one, so disabling keys before performing bulk insert operations should give a considerable speedup. Using ALTER TABLE ... DISABLE KEYS requires the INDEX privilege in addition to the privileges mentioned earlier. While the non-unique indexes are disabled, they are ignored for statements such as SELECT and EXPLAIN that otherwise would use them -----Original Message----- From: kalin m [mailto:[EMAIL PROTECTED] Sent: Wednesday, May 21, 2008 5:55 PM To: mysql@lists.mysql.com Subject: indexes and speeds hi all... just wondering what is the performance difference between: PRIMARY KEY [/|index_type|/] (/|index_col_name|/1,/|index_col_name|/2) at the time of the table creation or create index index_name1 on table_name (/|index_col_name|/1); create index index_name2 on table_name (/|index_col_name|/2); after the table has been made? the question i guess is: is there performance advantage to have a primary key defined on two (or more) fields (columns) at the time of table creation or is it better to have different indexes (keys) defined separately for each column that needs to be indexed? thanks -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]