MySQL自增与自建sequence性能测试

MySQL主键自增与自建序列的性能比较


场景:在oracle数据库,custcontactinfo的ID为主键,但是数据类型为字符型,由sequence生成,
现需要将数据库迁移到MySQL平台,但是MySQL没有sequence,且主键的自增仅支持int类型。
服务器配置:虚拟机,4G内存,2vcpu

测试场景:新建表s_custcontactinfo,作为新建序列,表custcontactinfo 的主键从s_custcontactinfo.nextval获取,
CUSTCONTACTINFO_TMP主键为自增。
测试目的:验证这两种主键获取方式的性能

验证结果MySQL自增性能较优


mysql> desc s_custcontactinfo;
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| nextval | int(11) | YES  |     | NULL    |       |
+---------+---------+------+-----+---------+-------+
1 row in set (0.05 sec)




mysql> desc CUSTCONTACTINFO_TMP;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| CUSTOMERGUID    | varchar(38)  | YES  |     | NULL    |                |
| NAME            | varchar(45)  | YES  |     | NULL    |                |
| IDCARD          | varchar(18)  | YES  |     | NULL    |                |
| MOBILE          | varchar(11)  | YES  |     | NULL    |                |
| GENDER          | char(1)      | YES  |     | NULL    |                |
| RELATION        | varchar(38)  | YES  |     | NULL    |                |
| ISLOCKED        | char(1)      | YES  |     | NULL    |                |
| LIVEADDRESS     | varchar(150) | YES  |     | NULL    |                |
| CORPNAME        | varchar(100) | YES  |     | NULL    |                |
| CORPTEL         | varchar(30)  | YES  |     | NULL    |                |
| DEPT            | varchar(50)  | YES  |     | NULL    |                |
| POSITION        | varchar(50)  | YES  |     | NULL    |                |
| CORPADDRESS     | text         | YES  |     | NULL    |                |
| REMARK          | text         | YES  |     | NULL    |                |
| HOUSEPHONE      | varchar(40)  | YES  |     | NULL    |                |
| CUSTCONTACTTYPE | char(1)      | YES  |     | NULL    |                |
| RELATIONOTHER   | varchar(20)  | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
18 rows in set (0.00 sec)


mysql> desc custcontactinfo;
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| id              | varchar(38)  | NO   | PRI | NULL    |       |
| CUSTOMERGUID    | varchar(38)  | YES  |     | NULL    |       |
| NAME            | varchar(45)  | YES  |     | NULL    |       |
| IDCARD          | varchar(18)  | YES  |     | NULL    |       |
| MOBILE          | varchar(11)  | YES  |     | NULL    |       |
| GENDER          | char(1)      | YES  |     | NULL    |       |
| RELATION        | varchar(38)  | YES  |     | NULL    |       |
| ISLOCKED        | char(1)      | YES  |     | NULL    |       |
| LIVEADDRESS     | varchar(150) | YES  |     | NULL    |       |
| CORPNAME        | varchar(100) | YES  |     | NULL    |       |
| CORPTEL         | varchar(30)  | YES  |     | NULL    |       |
| DEPT            | varchar(50)  | YES  |     | NULL    |       |
| POSITION        | varchar(50)  | YES  |     | NULL    |       |
| CORPADDRESS     | text         | YES  |     | NULL    |       |
| REMARK          | text         | YES  |     | NULL    |       |
| HOUSEPHONE      | varchar(40)  | YES  |     | NULL    |       |
| CUSTCONTACTTYPE | char(1)      | YES  |     | NULL    |       |
| RELATIONOTHER   | varchar(20)  | YES  |     | NULL    |       |
+-----------------+--------------+------+-----+---------+-------+






初始数据量为:
mysql> select count(*) from custcontactinfo;---主键为字符型
+----------+
| count(*) |
+----------+
|   196195 |
+----------+
1 row in set (0.32 sec)


mysql> select count(*) from CUSTCONTACTINFO_TMP;---主键为int类型
+----------+
| count(*) |
+----------+
|   196195 |
+----------+
1 row in set (1.63 sec)


mysql> 






测试的脚本:


mysql> create procedure P_CUSTCONTACTINFO_TMP()
   begin
    declare j int default 0;
    declare m int default 0;
    declare begin_insert TIMESTAMP default now();
    declare end_insert TIMESTAMP default now();
    declare timeconsum int default 0;
    declare i int default 0;
    while j<5 do
       set i=0;
       set j=j+1;
       set begin_insert=now();
       while i<100 do
            INSERT INTO CUSTCONTACTINFO_TMP (CUSTOMERGUID, NAME, IDCARD, MOBILE, GENDER, RELATION, ISLOCKED, LIVEADDRESS, CORPNAME, CORPTEL, DEPT, POSITION, CORPADDRESS, REMARK, HOUSEPHONE, CUSTCONTACTTYPE, RELATIONOTHER) 
            VALUES ('{5F6E1ED3-36AA-452C-92D4-34E8091B1675}', '测试1', '900005100008010060', '18988888236', '2', '{16EC7EED-A836-439F-9318-2171FBDD235D}', '0', '火星深圳市区镇八联村啊八戒11栋8单元1D', '星球开发(火星)有限公司', '0755-10000-1234', '总经办', '总经理', '银河星系太阳系火星球', NULL, '0755-10000', '5', NULL);
            set i=i+1;
       end while;
       set end_insert=now();
       commit;
       set m=j*i;
       set timeconsum=timediff(end_insert,begin_insert);
       select (j-1)*i "开始插入数据",j*i "结束插入数据",timeconsum "数据插入耗时";
    end while;
     end


mysql> call P_CUSTCONTACTINFO_TMP;
+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                  0 |                100 |                 19 |
+--------------------+--------------------+--------------------+
1 row in set (18.30 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                100 |                200 |                 20 |
+--------------------+--------------------+--------------------+
1 row in set (38.75 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                200 |                300 |                 18 |
+--------------------+--------------------+--------------------+
1 row in set (57.00 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                300 |                400 |                 18 |
+--------------------+--------------------+--------------------+
1 row in set (1 min 14.27 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                400 |                500 |                 17 |
+--------------------+--------------------+--------------------+
1 row in set (1 min 31.95 sec)


Query OK, 0 rows affected (1 min 31.95 sec)








create procedure p_custcontactinfo()
    begin
    declare j int default 0;
    declare m int default 0;
    declare begin_insert TIMESTAMP default now();
    declare end_insert TIMESTAMP default now();
    declare timeconsum int default 0;
    declare nextval0 int; 
    declare i int default 0;
    while j<5 do
       set i=0;
       set j=j+1;
       set begin_insert=now();
       while i<100 do
            update s_custcontactinfo set nextval=nextval+1;
            select nextval into @nextval0  from s_custcontactinfo;
            INSERT INTO custcontactinfo (ID,CUSTOMERGUID, NAME, IDCARD, MOBILE, GENDER, RELATION, ISLOCKED, LIVEADDRESS, CORPNAME, CORPTEL, DEPT, POSITION, CORPADDRESS, REMARK, HOUSEPHONE, CUSTCONTACTTYPE, RELATIONOTHER) 
            VALUES (@nextval0,'{5F6E1ED3-36AA-452C-92D4-34E8091B1675}', '测试1', '900005100008010060', '18988888236', '2', '{16EC7EED-A836-439F-9318-2171FBDD235D}', '0', '火星深圳市区镇八联村啊八戒11栋8单元1D', '星球开发(火星)有限公司', '0755-10000-1234', '总经办', '总经理', '银河星系太阳系火星球', NULL, '0755-10000', '5', NULL);
            set i=i+1;
       end while;
       set end_insert=now();
       commit;
       set m=j*i;
       set timeconsum=timediff(end_insert,begin_insert);
       select (j-1)*i "开始插入数据",j*i "结束插入数据",timeconsum "数据插入耗时";
    end while;
     end




mysql> call p_custcontactinfo;
+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                  0 |                100 |                 36 |
+--------------------+--------------------+--------------------+
1 row in set (36.19 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                100 |                200 |                 36 |
+--------------------+--------------------+--------------------+
1 row in set (1 min 12.28 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                200 |                300 |                 36 |
+--------------------+--------------------+--------------------+
1 row in set (1 min 47.79 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                300 |                400 |                 36 |
+--------------------+--------------------+--------------------+
1 row in set (2 min 24.08 sec)


+--------------------+--------------------+--------------------+
| 开始插入数据       | 结束插入数据       | 数据插入耗时       |
+--------------------+--------------------+--------------------+
|                400 |                500 |                 35 |
+--------------------+--------------------+--------------------+
1 row in set (2 min 58.53 sec)


Query OK, 0 rows affected (2 min 58.53 sec)


mysql> 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10569970/viewspace-1732755/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10569970/viewspace-1732755/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值