关于uuid与自增列的选择

在db交流群里看到有人提问,说他的userName 登录名是唯一的,可以用其做主键嘛,如果用自增列,那又要多一列。

后面又说,如果要用主键ID,用uuid会不会好一些呢?作为新手的我也对这个问题发生了兴趣,百度检索下得出大致结论:

uuid:可以简单的的理解为全球唯一标识符

一、缺点

  1.无序性:uuid是无序的, 插入数据时,页的位置会发生变化,页分裂,速度慢。一般情况下主键是聚簇索引,会把相邻主键的数据安放在相邻的物理存储上。如果主键不是自增,而是随机的,那么频繁的插入会使 innodb 频繁地移动磁盘块,而影响写入性能。

  2.占空间大:uuid占的空间大,并且别的索引还都要包含主键的值,那么每个索引的空间也都会增大,占的空间大,需要读数据时一般会认为需要的io次数多, 如果需要分库分表,往往是海量数据,这个时候使用UUID不是一个好的选择(占用空间太大)。主键一般情况下追求短整型,确定好你的整型类型(根据需求)。

二、优点

  1.数据离散化便于发布集群

  2.利于水平分割

  3.数据多写,合并复制等分布式操作

自增ID:可以简单理解成一个自增的序列

缺点:

  1.不利于水平分割

  2.插入增加增量,删除不减少增量

  3.数据聚集化不便于发布集群

  4.主键冲突。

  系统大了点,要考虑分布式,甚至数据库双写之类,这样的策略是不够的。举个例子,系统做了双机房,想做一个数据库的异地双向同步。那么当双方还没同步的情况下,可能录入了同样的ID。当然了,只是双机房的话还是可以用 increase by 的方式,把数据库自增步伐修改为奇偶。比如说机房1的主库是基数的ID,机房2的主库是偶数的ID。双向同步创建数据来说就没有冲突了。(双向同步还有好多问题的,并发下的update时序问题等这里不展开讨论)

优点:即uuid缺点的反向

总结:

  总体需要看你索引适应的形式,如果使用 b-tree 索引形式,有序 id 比无需 id 好,如果是 hash 索引,两个差别不大。
  主要原因是索引在磁盘上存储的形式,常用的 b-tree 索引如果 id 是连续的,那么数据存储在相邻的磁盘上,如果查询和写入操作的 id 连续,那么减少随机读写硬盘的几率,提升读写效率。
  所以看你的实际情况,如果你用的是 b-tree 索引,同时记录比较多,那么用有序 id 作为索引效率会高很多。具体情况题主可以自己测试一下,差距明显。
考虑因素要点 :
  1.随机IO与顺序IO
  2.页分裂与所占空间大小
  3.分库分表以及分布式集群
  4.对等拓扑、合并复制、数据多写
 
 
 
 
参考自:
1.http://www.cnblogs.com/ELMND/p/4863577.html
2.https://www.zhihu.com/question/43500172

关于uuid与自增列的选择的更多相关文章

  1. MySQL--自增列学习

    ##=====================================================================================## 在数据库表设计中会纠 ...

  2. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  3. (转)mysql中InnoDB表为什么要建议用自增列做主键

    InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...

  4. InnoDB表要建议用自增列做主键

    InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子节点(leaf pages of the tre ...

  5. mysql中InnoDB表为什么要建议用自增列做主键

    InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...

  6. innodb 自增列重复值问题

    1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, ...

  7. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

  8. MySQL面试题之为什么要为innodb表设置自增列做主键?

    为什么要为innodb表设置自增列做主键? 1.使用自增列做主键,写入顺序是自增的,和B+数叶子节点分裂顺序一致 2.表不指定自增列做主键,同时也没有可以被选为主键的唯一索引,InnoDB就会选择内置 ...

  9. MySQL -- Innodb是如何处理自增列的

    对于那些向带有自增列的表中插入行的语句,Innodb提供一种可配置的锁定机制,这种锁定机制可以显著提高SQL语句的可伸缩性和性能. Innodb中为了使用自增机制,自增列必须是索引的部份,从而可以使用 ...

随机推荐

  1. PureMVC--一款多平台MVC框架

    官网:http://puremvc.org/ 下载:https://github.com/PureMVC/puremvc-csharp-multicore-framework/tree/1.1.0 A ...

  2. [java ] java.util.zip.ZipException: error in opening zip file

    严重: Failed to processes JAR found at URL [jar:file:/D:/tools/apache-tomcat-7.0.64_2/webapps/bbs/WEB- ...

  3. 九度 1529:棋盘寻宝(递推DP)

    题目描述: 现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应 ...

  4. AsyncTask应用示例

    package com.example.testdemo; import java.io.ByteArrayOutputStream; import java.io.IOException; impo ...

  5. 图像识别api

    https://console-cloud.megvii.com/

  6. PHP webservice 接口实例

    原文地址,就不摘抄了 http://www.sky00.com/archives/91.html

  7. Delphi Code Editor 之 几个特性(转)

    Delphi Code Editor有几个特性在编写大规模代码时非常有用.下面分别进行介绍: 原地址:http://www.cnblogs.com/pchmonster/category/343330 ...

  8. 深入浅出Docker(六):像谷歌一样部署你的应用

    1.概述 谷歌发起的开源项目从来都是广受技术圈的关注和讨论,本文将介绍的就是最新的容器编排管理系统Kubernetes.Kubernetes开源项目版本更新频繁,对于初次使用者来说其定义大量的技术术语 ...

  9. 开源的PaaS方案:在OpenStack上部署CloudFoundry (一)简介

    目录(?)[-] OpenStack简介 OpenStack是一个美国国家航空航天局和Rackspace合作研发的以Apache许可证授权并且是一个自由软件和开放源代码项目 OpenStack是一个云 ...

  10. ajax操作的链式写法

    ajax操作的传统写法: $.ajax({ url: url, success: function(){ doWhenSuccess(); }, error: function(){ doWhenEr ...