实测 Mysql UUID 性能

网上普遍认为Mysql  使用 UUID 主键性能低下,甚至建议用 自增ID 作为主键并用 UUID作唯一索引的方案。但没有提供具体的数据证明使用 UUID 作为主键时性能究竟低下到何种程度。为此我专门做了测试。

测试环境:WindowsXP ,内存 4G , CPU : Duo T6570 , mysql : 5.1.36

测试准备:

1、 建表

我建了3 个表来做性能比对

表一:uuidtest_inno

CREATE TABLE `uuidtest_inno` (  

`id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',  

PRIMARY KEY (`id`)  

) ENGINE=InnoDB DEFAULT CHARSET=latin1  

 

表二:uuidtest_myisam

CREATE TABLE `uuidtest_myisam` (  

  `id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',  

  PRIMARY KEY (`id`)  

) ENGINE=MyISAM DEFAULT CHARSET=latin1  

表三:uuidtest_int

    CREATE TABLE `uuidtest_int` (  

      `id` int(11) NOT NULL AUTO_INCREMENT,  

      `test` varchar(255) CHARACTER SET latin1 DEFAULT NULL,  

      PRIMARY KEY (`id`)  

) ENGINE=MyISAM DEFAULT CHARSET=utf8  

可以看到,表一使用UUID 主键,引擎为 InnodB ;表二使用 UUID 主键,引擎为 MyISAM ;表三使用 自增ID ,引擎为MyISAM ;

1、 编写存储过程

编写存储过程分别插入100000 条记录:

p_uuid_inno

BEGIN  

    set @i = 0;  

    while @i < 100000 do  

            insert into uuidtest_inno value(uuid());  

        set @i = @i+1;  

    end while ;  

END  

 

p_uuid_myisam

BEGIN  

    set @i = 0;  

    while @i < 100000 do  

            insert into uuidtest_myisam value(uuid());  

        set @i = @i+1;  

    end while ;  

END  

 

p_uuid_int

BEGIN  

    set @i = 0;  

    while @i < 100000 do  

            insert into uuidtest_int(test) value("test");  

        set @i = @i+1;  

    end while ;  

END  

 

1、 运行

[SQL] call p_uuid_int;

影响的数据栏: 0

时间: 12.922ms

 

call p_uuid_myisam;

影响的数据栏: 0

时间: 15.078ms

 

call p_uuid_inno;

影响的数据栏: 0

时间: 4460.297ms

 

结论:当数据表的引擎为MyISAM 时,自增 ID 无疑是效率最高的, UUID 效率略低,但不会低到无法接受。一旦数据引擎为 InnodB 时,效率下降非常严重,已经达到令人发指的地步。由于 InnodB 主键采用 聚集索引 ,会对插入的记录进行物理排序,而 UUID本身基本上是无序的,所以造成了巨大的 I/O 开销。所以如果使用 innodB  千万不要使用 UUID 。

转载:http://cornerxp.iteye.com/blog/977463