在MySQL5.1.X版本里,创建和删除聚集索引的过程如下:
1)创建一个和原表结构一样的空表,然后创建聚集索引。
2)复制原表的数据到新表,这时会对原表加一个排他锁,其他的会话dml操作会阻塞,从而保证数据的一致性。
3)复制完毕后删除原表,并把新表改名为原表。
创建和删除非聚集索引的过程如下:
1)创建一个和原表结构一样的空表,然后创建非聚集索引。
2)复制原表的数据到新表,这时会对原表加一个共享锁,其他的会话不能更新,但可以查询数据,从而保证数据的一致性。
3)复制完毕后删除原表,并把新表改名为原表。
从MySQL5.5.X版本开始,?创建和删除非聚集索引不用复制整个表的内容了。只须更新索引页,和之前相比,速度会更快。但创建聚集索引(主键)或者是外键时,还是需要复制整个表的内容,因为聚集索引是把 primary key 以及 row data 保存在一起的,而 secondary index 则是单独存放的,有个指针指向primary key。
表1-3是创建和删除非聚集索引的速度对比。
从结果上看,MySQL5.5.X的速度更快。
关于快速创建索引的介绍,请参见MySQL5.5手册: