博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实测 Mysql UUID 性能(转)
阅读量:4638 次
发布时间:2019-06-09

本文共 1820 字,大约阅读时间需要 6 分钟。

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

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

测试准备:

1、 建表

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

表一:uuidtest_inno

 
Sql代码  
  1. CREATE TABLE `uuidtest_inno` (  
  2. `id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',  
  3. PRIMARY KEY (`id`)  
  4. ) ENGINE=InnoDB DEFAULT CHARSET=latin1  
 

 

表二:uuidtest_myisam

Sql代码  
  1. CREATE TABLE `uuidtest_myisam` (  
  2.   `id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',  
  3.   PRIMARY KEY (`id`)  
  4. ) ENGINE=MyISAM DEFAULT CHARSET=latin1  

 

 

表三:uuidtest_int

Sql代码  
  1.     CREATE TABLE `uuidtest_int` (  
  2.       `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.       `test` varchar(255) CHARACTER SET latin1 DEFAULT NULL,  
  4.       PRIMARY KEY (`id`)  
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8  

 

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

 

1、 编写存储过程

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

 

p_uuid_inno

Sql代码  
  1. BEGIN  
  2.     set @i = 0;  
  3.     while @i < 100000 do  
  4.             insert into uuidtest_inno value(uuid());  
  5.         set @i = @i+1;  
  6.     end while ;  
  7. END  

 

p_uuid_myisam

Sql代码  
  1. BEGIN  
  2.     set @i = 0;  
  3.     while @i < 100000 do  
  4.             insert into uuidtest_myisam value(uuid());  
  5.         set @i = @i+1;  
  6.     end while ;  
  7. END  

 

 

p_uuid_int

Sql代码  
  1. BEGIN  
  2.     set @i = 0;  
  3.     while @i < 100000 do  
  4.             insert into uuidtest_int(test) value("test");  
  5.         set @i = @i+1;  
  6.     end while ;  
  7. 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 。

 

 

谢谢

 

2 楼 2012-02-29  
测试不严谨,你没有测试innodb下的int,一样的速度。

 

1 楼 2011-04-19  
楼主有心
如果断定是因为innodb是因为物理排序而造成性能损失, 那么是什么做主键就没关系了
只要是无序的数字, 字符串做主键,都要有这样的结果
人们讲用uuid会影响性能, 是说UUID的生成效率不高. 而非插入效率,  生成了之后,UUID就是一普通字符串了.

 

转载于:https://www.cnblogs.com/tonykan/archive/2012/11/26/2788422.html

你可能感兴趣的文章
[git] 细说commit (git add/commit/diff/rm/reset 以及 index 的概念)
查看>>
DOM Core和HTML DOM的区别
查看>>
SurfaceView+MediaPlay的bug们
查看>>
网络表示学习总结
查看>>
完成评论功能
查看>>
far和near
查看>>
Python爬虫实战四之抓取淘宝MM照片
查看>>
2015 Multi-University Training Contest 1
查看>>
C#判断一个字符串是否是数字或者含有某个数字
查看>>
SVN使用指南
查看>>
【转载】掌 握 3 C ‧ 迎 接 亮 丽 职 涯
查看>>
爬取网站附件
查看>>
java基础图形界面和IO系统
查看>>
javascript学习笔记
查看>>
hdu 3996
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
python学习笔记之函数装饰器
查看>>
FEM计算2D瞬态热传导方程
查看>>
四年时光,匆匆而过
查看>>
【php】【psr】psr1 基础编码规范
查看>>