当前位置: 首页 > 编程日记 > 正文

实测 Mysql UUID 性能(转)

网上普遍认为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 楼 gaizai 2012-02-29
测试不严谨,你没有测试innodb下的int,一样的速度。

1 楼 laoxing521 2011-04-19
楼主有心

如果断定是因为innodb是因为物理排序而造成性能损失, 那么是什么做主键就没关系了
只要是无序的数字, 字符串做主键,都要有这样的结果

人们讲用uuid会影响性能, 是说UUID的生成效率不高. 而非插入效率,  生成了之后,UUID就是一普通字符串了.

 

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

相关文章:

date类型_06076.1.0如何将ORC格式且使用了DATE类型的Hive表转为Parquet表

温馨提示&#xff1a;如果使用电脑查看图片不清晰&#xff0c;可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github&#xff1a;https://github.com/fayson/cdhproject提示&#xff1a;代码块部分可以左右滑动查看噢1文档编写目的在CDH中使用Hive时&#xff0…

SetGet and MACRO

为什么80%的码农都做不了架构师&#xff1f;>>> Set&Get 配合private是c class里面常用的。 这样很大程度上可以对数据的存取进行控制。 最近接触了大量的struct&#xff0c;然后直接存取其中变量的代码&#xff0c;在debug 跟踪的时候颇感不便。 Set&Get直…

spark之scala快速入门

scala和java都是在jvm之上的语言&#xff0c;相对来讲&#xff0c;scala热度比较低&#xff0c;其实并不是一个特别好的语言选择。 原因倒不是因为scala本身的缺点&#xff0c;而是使用人群不够多&#xff0c;论坛和社区不够活跃。这就跟社交软件一样&#xff0c;大家都用微信&…

python 归一化_只需 45 秒,Python 给故宫画一组手绘图!

作者 | 丁彦军责编 | 伍杏玲13日早晨&#xff0c;当北京市民拉开窗帘时发现&#xff0c;窗外雪花纷纷扬扬在空中飘落&#xff0c;而且越下越大&#xff0c;树上、草地、屋顶、道路上&#xff0c;都落满雪花。京城银装素裹&#xff0c;这是今冬以来北京迎来的第二场降雪。一下雪…

Windows平台下程序打包流程

Windows平台下程序打包流程 1、所有测试完成之后、程序release编译完成 2、依赖库打包 执行deploy.bat 脚本打包最新的程序以及依赖库 3、可执行程序打包 打开打包工程文件.evb&#xff0c; 使用 enigma virtual Box 打包可执行程序 点击“执行封包”&#xff0c;开始打包 …

一个apk多个ICON执行入口

一个工程对应一个AndroidManifest.xml文件&#xff0c;这个文件中包含有该项目的一些设置&#xff0c;如权限、SDk版Activity、Service信息等。一般而言&#xff0c;这个文件中会有且仅有一个application节点&#xff0c;这个节点表示这是一个应用程序&#xff0c;不管它下面还…

vbs之CurrentDirectory

为什么80%的码农都做不了架构师&#xff1f;>>> 最近要用一下Oracle instantclient的ODBC&#xff0c;由于配置有点繁琐&#xff0c;于是打算用vbs写一脚本来自动化一下&#xff0c;刚开始是这样的&#xff1a; Set ws CreateObject("WScript.Shell") w…

详解javascript: void(0);

原文 简书原文&#xff1a;https://www.jianshu.com/p/08ae8cbeb3be 什么是javascript: void(0); 我们经常会使用到 javascript:void(0) 这样的代码&#xff0c;那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢&#xff1f;  javascript:void(0) 中最关键的是 v…

读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

读书笔记&#xff1a;编写高质量代码--web前端开发修炼之道 这本书看得断断续续&#xff0c;不连贯&#xff0c;笔记也是有些马虎了&#xff0c;想了解这本书内容的童鞋可以借鉴我的这篇笔记&#xff0c;希望对大家有帮助。 笔记有点长&#xff0c;所以分为一&#xff0c;二两个…

# Qt程序版本号使用

Qt程序版本号使用 在pro文件中添加&#xff08;版本号可以3段或者4段&#xff09; VERSION1.0.1.2DEFINES APP_VERSION\\\"$${VERSION}\\\"实际代码中使用 QString version APP_VERSION;qInfo()<<"版本信息:"<< version;

python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题

安装了pytest后&#xff0c;运行了一下&#xff0c;看不懂了&#xff0c;不过你前面的说对了 Testing started at 10:15 ... C:\Users\Administrator\PycharmProjects\untitled4\venv\Scripts\python.exe "D:\Program Files (x86)\PyCharm Community Edition 2018.2.4\hel…

Directx11教程(6) 画一个简单的三角形(2)

在上篇教程中&#xff0c;我们实现了在D3D11中画一个简单的三角形&#xff0c;但是&#xff0c;当我们改变窗口大小时候&#xff0c;三角形形状却随着窗口高宽比例改变而改变&#xff0c;如下图所示&#xff1a; 这是因为我们改变了窗口大小&#xff0c;但后缓冲大小在程序初始…

【单调栈 前缀和 异或】7.21序列求和

还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题。她定义一个区间的价值是max(ai)(l<i<r)∗(alxoral1xor...xorar)max(ai)(l<i<r)∗(alxoral1xor...xorar)她想要知道&#xff0c;一个序列所有的连续子序列价值之和是多少。 输入格式 第一行一…

hibernate 复合主键 根据主键删除_hibernate封装Utils工具类

一&#xff1a;封装Session对象1、获取全新的Session的对象 2、获取与线程绑定的的Session的对象二&#xff1a;什么是持久化类1、Hlbernate是持久层的ORM映射框架&#xff0c;专注于数据的持久化工作。所谓的持久化&#xff0c;就是将内存中的数据永久存储到关系型数据库中。 …

Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

LinuxQt 下同一数据空间vfork多进程间通信的一种高效便捷方式&#xff08;信号槽直接调用&#xff09; 概述 传统的多进程间通信往往非常麻烦&#xff0c;采用的方法比如管道&#xff0c;共享内存&#xff0c;socket&#xff0c;文件等&#xff0c;大都非常繁琐&#xff0c; …

Eclipse 调试器(引用IT168)

Eclipse 调试器&#xff1a;零距离接触实战技巧 2011年11月25日01:29IT168字号&#xff1a;T|T调试的方法虽然千千万万&#xff0c;但归根结底&#xff0c;就是找到引发错误的代码。Eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断。该调试器提供所有标准调…

Cisco交换机与路由器的密码恢复_路由交换

站长原创&#xff1a;歪歪IT技术网 首发&#xff1a;迷你兔 来51cto记录一下我们net人最不喜欢记的路由器和交换机的密码恢复问题&#xff0c;虽然很简单的几个步骤&#xff0c;但是我却总是记不住&#xff0c;应该不是记不住&#xff0c;就觉得用处不大&#xff0c;但工作中…

投影转换_即插即用,办公投影不用愁:毕亚兹Mini DP转HDMIVGA转换器

日常办公的时候一些办公小件也很有用的&#xff0c;就比如说HDMI&#xff0c;VGA的转接头&#xff0c;不起眼但是很实用。去客户那里汇报工作&#xff0c;笔记本没有VGA接口&#xff0c;结果会很尴尬&#xff0c;到处借&#xff0c;没有转接头就是接不了&#xff0c;所以索性还…

事件绑定在IE下this是window的问题

昨天写一个函数的时候&#xff0c;后来用了事件绑定&#xff0c;开始没在IE下测试&#xff0c;在chrome下都是没问题的。后来在IE下测试发现出错。 后来修改一下&#xff0c;发现oBox.οnclickfunction(){}没问题&#xff0c;而addEven(oBox, "click", function(){})…

nvidia-jetson系列硬件平台上安装Qt

nvidia-jetson系列硬件平台上安装Qt 目标平台: Jetson Nano、Jetson TX2、etson Xavier NX、Jetson AGX Xavier 概述: 系统环境: 我的设备是下列环境&#xff0c;其实只要是L4T版本的应该都是可以的 镜像烧录方式&#xff1a;SDKManager 系统镜像版本&#xff1a;L4T-32.…

以后在这里安家

以后在这里安家&#xff0c;希望在这里学到更多的知识&#xff0c;分享更多的快乐与汗水&#xff0c;希望大家共同成长转载于:https://blog.51cto.com/heyangfan88/804542

如何用git命令行上传本地代码到github

如何用git命令行上传本地代码到github 2016年09月19日 16:10:36 阅读数&#xff1a;9337注意&#xff1a;安装的前提条件是配置好git的相关环境或者安装好git.exe&#xff0c;此处不再重点提及 上传的步骤&#xff1a;(本文采用git 命令界面进行操作) &#xff08; git config …

C# 的快捷键汇总(一)

全局快捷键 ——〉下列快捷组合键可用于集成开发环境 (IDE) 中的不同位置 命令名 快捷键 说明 关系图.属性 Alt Enter 将焦点从关系图切换到“属性”窗口。 编辑.复制 Ctrl C 将选定项复制到剪贴板。 编辑.剪切 Ctrl X 从…

git修改远程仓库地址

原文连接: https://blog.csdn.net/u012852597/article/details/79241548 内容&#xff1a; 方法有三种&#xff1a; 1.修改命令 git remote set-url origin [url] 例如: git remote set-url origin gitlabgitlab.chumob.com:php/hasoffer.git2.先删后加 git remote rm or…

ftp主动和被动模式_【扫盲】FTP基础知识详解

关注我&#xff0c;你的眼睛会怀孕本文主要介绍FTP的工作原理&#xff0c;FTP主动与被动两种工作模式。FTP 简介FTP协议就是文件传输控制协议。它可以使文件通过网络从一台主机传送到同一网络的另一台主机上&#xff0c;而不受计算机类型和操作系统类型的限制。服务器、大型机&…

单页面与多页面的区别及优缺点

单页面应用&#xff08;SPA&#xff09;&#xff0c;通俗一点说就是指只有一个主页面的应用&#xff0c;浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候&#xff0c;还是会分开写&#xff08;页面片段&#xff09;&…

git使用手册

git使用手册 由 赵庆鹏创建, 最后修改于十二月 14, 2018 一、文件比较 1. 新建两个文件hello/world&#xff0c;内容可自定义&#xff0c;两个文件的内容&#xff0c;需要不相同&#xff0c;进行文件比对。2. 使用diff -u hello world > diff.txt&#xff0c;进行文件比…

python 乒乓球_python乒乓球

这是我用python编的一个小游戏&#xff0c;需要下载simpleaudio库&#xff0c;喜欢的可以玩。 以下是源代码&#xff1a; import turtle as t import simpleaudio as sa yeahsa.WaveObject.from_wave_file(‘bounce.wav’) #创建背景 game t.Screen() game.title(‘双人乒乓球…

《深入浅出Windows Phone 8应用开发》

章节 第1章 概述第2章 开发环境第3章XAML简介第4章 常用控件第5章 布局管理第6章 数据存储第7章 图形动画第8章 多媒体 第9章 启动器与选择器 第10章 手机感应编程第11章 MVVM模式第12章 Silverlight Toolkit组件第13章 网络编程第14章 异步编程与并行编程第15章 联系人和日程安…

CentOS7.4到Elasticsearch一路坑(五)

来来&#xff0c;zookeeper我们聊聊 zookeeper我是搭建了一个集群的&#xff0c;但是搭建完发现&#xff0c;bin/zkServer.sh status一直是不正常的 看了一下日志&#xff0c;的确有问题&#xff08;有问题你还起来了&#xff1f;&#xff09; 从这篇文章参考了一下&#xff1a…