文档章节

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

北京起航
 北京起航
发布于 2015/05/22 18:43
字数 669
阅读 750
收藏 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 InnoDB引擎主键选择问题

mysql InnoDB引擎主键选择问题 1、自增ID ,这样会被用户猜到主键顺序,从而可以恶意操作。 2、采用UUID主键,但是InnDB引擎的mysql会排序加大IO,导致性能大幅度下降。。 ----------------...

chi_9
2013/05/22
905
7
mysql UUID和int做主键插入速度对比

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

Mr-Yang
2013/11/27
0
0
MySQL 字段 DEFAULT uuid() 怎么实现?

我的主键 PRIMARY KEY (`id`) 想用 UUID。 DEFAULT uuid() 不允许? CREATE TABLE `test` ( `id` VARCHAR(50) NOT NULL DEFAULT uuid(), `username` VARCHAR(250) NULL DEFAULT NULL, `valu......

netkiller-
2013/07/09
11.8K
8

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
12
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部