MySQL海量数据单一字段更新

前言

昨天发了一篇MySQL中索引对千万级数据查询效率优化实践的博文

文章链接:https://blog.csdn.net/Return_head/article/details/90699140

所以手上有着5000万的数据,很多以前想做的实验也有机会去尝试了。今天上课突然想起来一篇数据库的面试题。

大概是说:某公司有一张亿级的用户表,用户表有一个积分字段。这个字段会在每年新年凌晨0点的时候进行清零,要求给出解决的思路。

大概记得有两种思路:一是使用UPDATE语句直接遍历修改每一条记录的积分字段,将其修改为0;二是删除该字段,然后重新添加积分字段,并且设置该字段默认值为0。

答案是说第二种方式更优,但具体能优化多少并未说明。所以今天特地进行一下实验。

 

实验

1.使用test_database库

2.建立user表

同样,由于是进行实验,所以数据库引擎推荐使用MyISAM。批量插入更快。

3.创建存储过程

4.调用存储过程

5.查询所有记录数量

6.通过UPDATE将user_exp字段修改为0

7.删除user_exp字段

8.重新添加user_exp字段,并设置默认值为0

 

结论

通过以上实验不难发现,第二种方法在效率上要比第一种方法快出一倍左右。所以对于海量数据而言,修改操作若是重复性的,不推荐直接利用UPDATE进行修改,采用DDL语句修改表结构不失为一种更好的解决方案。

下面给出以上实验的SQL语句,方便大家进行测试。

#使用test_database库
USE test_database;

#创建user表
CREATE TABLE user(
    id bigint(10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_name varchar(10) DEFAULT NULL,
    user_exp int DEFAULT 0
)ENGINE=MyISAM AUTO_INCREMENT=100000001 DEFAULT CHARSET=utf8;

#定义存储过程userproc
DELIMITER // 
CREATE PROCEDURE userproc()
BEGIN
    DECLARE num int;
    SET num=1;
    WHILE num <=10000000 DO
        INSERT INTO user(user_name,user_exp) VALUES(num,num);
        SET num=num+1;
    END WHILE;
END //
DELIMITER ; 

#调用存储过程userproc
CALL  userproc();

#user表计数
SELECT COUNT(*) FROM user;

#修改所有记录user_exp字段为0
UPDATE user SET user_exp=0;

#删除user_exp列
ALTER TABLE user DROP COLUMN user_exp;

#新建user_exp列,并修改其默认值为0
ALTER TABLE user ADD COLUMN user_exp int DEFAULT 0;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值