实测 Mysql UUID 性能(转)
2012-11-26 00:54
246 查看
网上普遍认为Mysql 使用 UUID 主键性能低下,甚至建议用 自增ID 作为主键并用 UUID作唯一索引的方案。但没有提供具体的数据证明使用 UUID 作为主键时性能究竟低下到何种程度。为此我专门做了测试。
测试环境:WindowsXP ,内存 4G , CPU : Duo T6570 , mysql : 5.1.36
测试准备:
1、 建表
我建了3 个表来做性能比对
表一:uuidtest_inno
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
CREATE TABLE `uuidtest_inno` (
`id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
表二:uuidtest_myisam
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
CREATE TABLE `uuidtest_myisam` (
`id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
表三:uuidtest_int
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
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
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
BEGIN
set @i = 0;
while @i < 100000 do
insert into uuidtest_inno value(uuid());
set @i = @i+1;
end while ;
END
p_uuid_myisam
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
BEGIN
set @i = 0;
while @i < 100000 do
insert into uuidtest_myisam value(uuid());
set @i = @i+1;
end while ;
END
p_uuid_int
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
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/images/smiles/icon_biggrin.gif)
2 楼 gaizai 2012-02-29
测试不严谨,你没有测试innodb下的int,一样的速度。
1 楼 laoxing521 2011-04-19
楼主有心
如果断定是因为innodb是因为物理排序而造成性能损失, 那么是什么做主键就没关系了
只要是无序的数字, 字符串做主键,都要有这样的结果
人们讲用uuid会影响性能, 是说UUID的生成效率不高. 而非插入效率, 生成了之后,UUID就是一普通字符串了.
测试环境:WindowsXP ,内存 4G , CPU : Duo T6570 , mysql : 5.1.36
测试准备:
1、 建表
我建了3 个表来做性能比对
表一:uuidtest_inno
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
CREATE TABLE `uuidtest_inno` (
`id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
表二:uuidtest_myisam
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
CREATE TABLE `uuidtest_myisam` (
`id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
表三:uuidtest_int
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
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
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
BEGIN
set @i = 0;
while @i < 100000 do
insert into uuidtest_inno value(uuid());
set @i = @i+1;
end while ;
END
p_uuid_myisam
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
BEGIN
set @i = 0;
while @i < 100000 do
insert into uuidtest_myisam value(uuid());
set @i = @i+1;
end while ;
END
p_uuid_int
Sql代码
![](http://cornerxp.iteye.com/images/icon_star.png)
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/images/smiles/icon_biggrin.gif)
2 楼 gaizai 2012-02-29
测试不严谨,你没有测试innodb下的int,一样的速度。
1 楼 laoxing521 2011-04-19
楼主有心
如果断定是因为innodb是因为物理排序而造成性能损失, 那么是什么做主键就没关系了
只要是无序的数字, 字符串做主键,都要有这样的结果
人们讲用uuid会影响性能, 是说UUID的生成效率不高. 而非插入效率, 生成了之后,UUID就是一普通字符串了.
相关文章推荐
- MySQL之——mysql5.5 uuid做主键与int做主键的性能实测
- mysql5.5 uuid做主键与int做主键的性能实测
- mysql5.5 uuid做主键与int做主键的性能实测
- mysql5.5 uuid做主键与int做主键的性能实测
- 实测 Mysql UUID 性能
- mysql5.5 uuid做主键与int做主键的性能实测
- mysql 自增id和UUID做主键性能分析,及最优方案
- Mysql 使用UUID和自增主键ID性能对比测试
- mysql uuid 性能调优
- Mysql分页查询获取totalCount大幅提升性能的办法总结
- MySQL 数据库性能优化之索引优化
- mysql性能优化-慢查询分析、优化索引和配置
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
- 一个MySQL 5.7 分区表性能下降的案例分析
- MySQL性能优化的最佳20+条经验
- MYSQL性能优化的最佳20+条经验
- MySQL 性能测试工具mysqlslap
- MySQL性能优化的最佳20+条经验
- MySQL基础----大幅度提高性能方案,分区表
- 数据库相关文章转载(2) MySQL自带的性能压力测试工具mysqlslap详解