文档章节

mysql InnoDB UUID 主键 性能优化【实践篇】.md 有序uuid

北京起航
 北京起航
发布于 2015/05/22 18:43
字数 669
阅读 719
收藏 2

mysql InnoDB uuid 主键 性能优化【实践篇】.md mysql InnoDB UUID 主键 性能优化【实践篇】.md 有序uuid mysql InnoDB UUID 主键 性能优化【原理篇】.md mysql InnoDB UUID 主键 性能优化【性能分析篇】.md

###1. java生成32位uuid和重新排序 uuid 36为 去掉-为32位

import com.google.common.base.CharMatcher;
import com.fasterxml.uuid.EthernetAddress;
import com.fasterxml.uuid.Generators;
public class UuidUtils {
    public static final TimeBasedGenerator UUID_GENERATOR =
            Generators.timeBasedGenerator(EthernetAddress.fromInterface());
 public static String getUuidByJugOrdered() {
        Logger LOGGER = LoggerFactory.getLogger(BasePojo4String.class);
        UUID uuidJug = UUID_GENERATOR.generate();
        String uuid = uuidJug.toString();
        uuid = uuid.substring(14, 19) + uuid.substring(9, 14) + uuid.substring(19, 24) + uuid
                .substring(24) + "-" + uuid.substring(0, 8);
        return CharMatcher.anyOf("-").removeFrom(uuid);
    }
}

转换结果示例

原始uuid    22886ea0-0048-11e5-9e24-fcaa1490706f    转换后    11e5-0048-9e24-fcaa1490706f-22886ea0
原始uuid    229c92e1-0048-11e5-9e24-fcaa1490706f    转换后    11e5-0048-9e24-fcaa1490706f-229c92e1
原始uuid    22b37642-0048-11e5-9e24-fcaa1490706f    转换后    11e5-0048-9e24-fcaa1490706f-22b37642
原始uuid    22ca80b3-0048-11e5-9e24-fcaa1490706f    转换后    11e5-0048-9e24-fcaa1490706f-22ca80b3
原始uuid    22de08b4-0048-11e5-9e24-fcaa1490706f    转换后    11e5-0048-9e24-fcaa1490706f-22de08b4

###2.mysql二进制存储 表主键字段

c_id  BINARY(16)  NOT NULL COMMENT 'ID',PRIMARY KEY (c_id)
binary的意思就是按原始的二进制方式存储,只存储二进制的信息

转换函数【32位字符<-->16字节】

DELIMITER $$
DROP FUNCTION IF EXISTS toBinaryUuid $$
CREATE FUNCTION toBinaryUuid($data VARCHAR(36)) 
RETURNS binary(16) DETERMINISTIC NO SQL
BEGIN
    DECLARE $result BINARY(16) DEFAULT NULL;
    IF $data IS NOT NULL THEN
        SET $data = REPLACE($data,'-','');
        SET $result = UNHEX($data);
    END IF;
    RETURN $result;
END
$$

DROP FUNCTION IF EXISTS toUuid $$
CREATE FUNCTION toUuid($data BINARY(16)) RETURNS char(36) CHARSET utf8
DETERMINISTIC
NO SQL
BEGIN
    DECLARE $result CHAR(36) DEFAULT NULL;
    IF $data IS NOT NULL THEN
        SET $result = HEX($data);
    END IF;
    RETURN $result;
END
$$
DELIMITER ;

-- 测试
SELECT toBinaryUuid('11e500322d38f45fa67dfcaa1490706f');
SELECT toUuid(toBinaryUuid('11e500322d38f45fa67dfcaa1490706f'));

###3.测试数据 测试表

DROP TABLE IF EXISTS poi_action_data CASCADE;
CREATE TABLE poi_action_data (
    c_id  BINARY(16)  NOT NULL COMMENT 'ID',
    c_user_id VARCHAR (80) NOT NULL COMMENT '用户ID',
    c_product_id VARCHAR (32) NOT NULL COMMENT '产品ID',
    c_project_id  VARCHAR (32) COMMENT '项目ID',
    c_type CHAR (1) NOT NULL COMMENT '动作类型,a=行为动作action,b=业务动作biz',
    c_action_id VARCHAR (32) NOT NULL COMMENT '动作编码',
    c_value VARCHAR (2000) COMMENT '指标值',
    c_time TIMESTAMP COMMENT '修改时间',
    c_product_version  VARCHAR (32) COMMENT '产品版本',
    c_log_id VARCHAR (32) NOT NULL COMMENT '日志ID',
    c_json VARCHAR (500) COMMENT 'json格式扩展信息',
    c_tag1 VARCHAR (32) COMMENT '冗余字段1',
    c_tag2 VARCHAR (32) COMMENT '冗余字段2',
    PRIMARY KEY (c_product_id,c_time,c_id)
    -- ,CONSTRAINT poi_ad_log_id FOREIGN KEY (c_log_id) REFERENCES poi_action_log (c_id) ON DELETE RESTRICT 
) ENGINE = INNODB COMMENT = '解析后的动作数据,时长、次数、业务量等';

插入数据、查询数据

INSERT INTO poi_action_data 
(c_id, c_user_id, c_product_id, c_project_id, c_type, c_action_id, c_value, c_time, c_product_version, c_log_id, c_json, c_tag1, c_tag2) 
VALUES (uuidToBinary('11e5003f0da3b434b5e7fcaa1490706f'), '1', '17', NULL, 'a', '12', '1', '2015-04-13 11:06:57', '10', '11e5003f0a850f10b5e7fcaa1490706f', NULL, NULL, NULL);
SELECT toUuid(c_id) FROM poi_action_data;

###4. mysql uuid

DELIMITER $$

DROP FUNCTION IF EXISTS toOrderedUuid $$
CREATE FUNCTION toOrderedUuid(uuid BINARY(36))
RETURNS binary(16) DETERMINISTIC 
RETURN UNHEX(CONCAT(SUBSTR(uuid, 15, 4),SUBSTR(uuid, 10, 4),SUBSTR(uuid, 1, 8),SUBSTR(uuid, 20, 4),SUBSTR(uuid, 25)))$$

DELIMITER ;
-- SELECT toOrderedUuid(UUID()),LENGTH(toOrderedUuid(UUID()));

© 著作权归作者所有

共有 人打赏支持
北京起航
粉丝 55
博文 52
码字总数 29304
作品 0
海淀
架构师
私信 提问
加载中

评论(5)

北京起航
北京起航
SELECT uuid_ordered(UUID()),LENGTH(uuid_ordered(UUID()));
北京起航
北京起航
mysql uuid重排
CREATE FUNCTION `uuid_ordered`(uuid BINARY(36))
RETURNS binary(16) DETERMINISTIC
RETURN UNHEX(CONCAT(SUBSTR(uuid, 15, 4),SUBSTR(uuid, 10, 4),SUBSTR(uuid, 1, 8),SUBSTR(uuid, 20, 4),SUBSTR(uuid, 25)));
北京起航
北京起航

引用来自“neo-chen”的评论

select uuid();
mysql 自带该功能
mysql自带的也是无序的 内存计算时,不需要和数据库通信。
netkiller-
netkiller-
为什么要用 Java生成,有特别需要? 使用 select uuid(); 不可以吗? 能解释一下吗?
netkiller-
netkiller-
select uuid();
mysql 自带该功能
mysql InnoDB UUID 主键 性能优化【原理篇】.md

mysql InnoDB uuid 主键 性能优化【原理篇】.mdmysql InnoDB UUID 主键 性能优化【实践篇】.md 有序uuidmysql InnoDB UUID 主键 性能优化【原理篇】.mdmysql InnoDB UUID 主键 性能优化【性能...

北京起航
2015/05/22
0
0
mysql InnoDB UUID 主键 性能优化【性能分析篇】.md

mysql uuid 主键 性能优化【性能分析篇】.mdmysql InnoDB UUID 主键 性能优化【实践篇】.md 有序uuidmysql InnoDB UUID 主键 性能优化【原理篇】.mdmysql InnoDB UUID 主键 性能优化【性能分...

北京起航
2015/05/22
0
1
mysql UUID和int做主键插入速度对比

刚开始使用mysql,要是用非常大的数据结构,得知mysql没有uuid的数据类型,只能使用varchar(36),到底性能怎么样呢,网上各有说辞,做个测试看看吧,有没有差距,到底差多少。 下面是测试代码...

Mr-Yang
2013/11/27
0
0
Mysql InnoDB 引擎 主键性能

前些天看到网上有人说:“Mysql InnoDB 引擎 主键不适合用UUID , 若要用UUID的话可考虑用 自增ID做物理主键,UUID做逻辑主键。” 带着以上问题,本人做了如下测试: 先自报测试环境: 测试电...

chi_9
2013/05/23
0
1
MYSQL主从复制搭建及切换操作(GTID与传统)

如下: MYSQL主从复制方式有默认的复制方式异步复制,5.5版本之后半同步复制,5.6版本之后新增GTID复制,包括5.7版本的多源复制。 MYSQL版本:5.7.20 操作系统版本:linux 6.7 64bit 1、异步...

rootliu
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx/Apache/PHP Hidden Version Number

nginx隐藏版本号的方法 在nginx配置文件nginx.conf中,加入以下代码: server_tokens off; apache隐藏版本号的方法 在apache配置文件httpd.conf中,加入以下代码: ServerTokens ProdServer...

Linux就该这么学
23分钟前
3
0
iOS 滚动视图 UIScrollView 代理方法 相关属性 状态栏 滚动条 回弹 弹簧效果

iOS 滚动视图 UIScrollView 代理方法 相关属性 状态栏 滚动条 回弹 弹簧效果 #import "ViewController.h"@interface ViewController () <span style="color:#ff0000;"><UIScrollViewDel......

壹峰
29分钟前
1
0
【转】Hive 工作原理详解

什么是Hive? Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。...

hnairdb
29分钟前
3
0
开源 java CMS - FreeCMS2.8 微信管理 公众号设置

项目地址:http://www.freeteam.cn/ 公众号设置 管理员可以在这里设置微信公众号的相关配置,每个站点都可设置自己的微信公众号。 其中接口URL需要配置在微信公众号中,如下图所示 App Key ...

freeteam
31分钟前
2
0
MySQL中 replace 函数应用

将以下字段中的【忻州】替换为【洛阳】 Sql语句如下 UPDATE sys_organization SET org_name = REPLACE(org_name,'忻州','洛阳'); 执行结果如下...

karma123
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部