小编给大家分享一下mysql中采用uuid而不使用自增ID有什么优势,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
采用uuid而不使用自增ID的,
优势:
1、数据迁移时不会有主键冲突。
2、在使用分布式架构的主主同步时,也无需配置auto_increment_offset/auto_increment_increment,保证搭建比较简单。
劣势:
1、uuid比bigint占用存储空间大。
2、数据量达到500w以上性能明显没有bigint快。
(性能从哪些方面去比较呢?)
单条查询,
范围查询,
范围统计,
插入,
更新,
备份恢复。
#######################################################
#这里我们只做了一个单条查询的效率比较
#######################################################
环境:单个台式机
ubuntu 14.04 64位,
cpu cores=2
mem=7935M
测试步骤:
1、分别创建以id,uuid为主键的表。
2、分别插入100w条记录(编写存储过程生成测试数据,收获:需要关闭自动提交,效率大大的提升)。
3、分别以id ,uuid执行单条查询。
4、比较查询时间
最后结果都是在0秒以内完成。
脚本见附件。
#################################
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `p_product_uuid`$$
CREATE DEFINER=`root`@`%` PROCEDURE `p_product_uuid`(IN n BIGINT)
BEGIN
DECLARE i INT DEFAULT 1 ;
SET autocommit = 0;
WHILE
(i <= n) DO
INSERT INTO tmp_id_uuid (id, UUID)
VALUES
(i, UUID()) ;
SET i = i + 1 ;
END WHILE ;
COMMIT;
SET autocommit = 1;
END$$
DELIMITER ;
#####################################
ps:在调试过程中,遇到sql一直在执行,需要停止掉,处理方式如下:
show processlist;
找出你要停止的语句
然后找出你要终止的语句的id
在系统下mysqladmin -uroot -ppassword kill 要杀的ID
#####################################
mysql> truncate table tmp_id_uuid;
Query OK, 0 rows affected (0.14 sec)
mysql> select count(*) from tmp_id_uuid;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql> call p_product_uuid(100000);
Query OK, 0 rows affected (5.16 sec)
mysql> select count(*) from tmp_id_uuid;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.04 sec)
mysql> truncate table tmp_id_uuid;
Query OK, 0 rows affected (0.15 sec)
mysql> call p_product_uuid(1000000);
Query OK, 0 rows affected (43.03 sec)
mysql> create table tmp2_id_uuid as select * from tmp_id_uuid;
Query OK, 1000000 rows affected (18.07 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
mysql> select count(*) from tmp2_id_uuid;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.31 sec)
mysql> alter table tmp_id_uuid add primary key (id);
Query OK, 0 rows affected (24.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table tmp2_id_uuid add primary key (uuid);
Query OK, 0 rows affected (25.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql>
mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tmp_id_uuid where id=500000;
+--------+--------------------------------------+
| id | uuid |
+--------+--------------------------------------+
| 500000 | e3332083-c743-11e6-bc1e-00e066731e45 |
+--------+--------------------------------------+
1 row in set (0.00 sec)
mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tmp2_id_uuid where uuid='e3332083-c743-11e6-bc1e-00e066731e45';
+--------+--------------------------------------+
| id | uuid |
+--------+--------------------------------------+
| 500000 | e3332083-c743-11e6-bc1e-00e066731e45 |
+--------+--------------------------------------+
1 row in set (0.00 sec)
mysql>
mysql>
以上是“mysql中采用uuid而不使用自增ID有什么优势”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。