《MysqL入门MysqL中UPDATE语句使用的实例教程》要点:
本文介绍了MysqL入门MysqL中UPDATE语句使用的实例教程,希望对您有用。如果有疑问,可以联系我们。
一、UPDATE常见用法
首先建立测试环境:
MysqL应用
DROP table IF EXISTS t_test;CREATE table t_test ( bs bigint(20) NOT NulL auto_increment,username varchar(20) NOT NulL,password varchar(20) default NulL,remark varchar(200) default NulL,PRIMARY KEY (bs)) ENGINE=InnoDB auto_INCREMENT=4 DEFAulT CHARSET=gbk; INSERT INTO t_test VALUES (1,'lavasoft','123456',NulL);INSERT INTO t_test VALUES (2,'hello',NulL,NulL);INSERT INTO t_test VALUES (3,'haha',zz,tt);
1、set一个字段
在表t_test中设置第二条记录(bs为2)的password为'***'.
MysqL应用
update t_test t set t.password = '***' where t.bs = 2;
2、set多个字段
在表t_test中设置第一条记录(bs为1)的password为'*'、remark为'*'.
MysqL应用
update t_test t set t.password = '*',t.remark = '*' where t.bs = 1;
3、set null值
在表t_test中设置第三条记录(bs为3)的password为null、remark为null.
MysqL应用
update t_test t set t.password = null,t.remark = null where t.bs = 3;
这个是依照标准语法写的,在不同的数据库系统中,update还有更多的写法,但是标准写法都是支持的.以上三个例子为了说明情况,每次都更新一行.在实际中,可以通过where语句约束来控制更新行数.MysqL应用
二、UPDATE使用中的相关性能问题以及解决办法
UPDATE的功能是更新表中的数据.这的语法和INSERT的第二种用法相似.必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围.MysqL应用
UPDATE table_anem SET column_name1 = value1,column_name2 = value2,WHERE ;
如下面的语句将users表中ID等于123的记录的age改为24MysqL应用
UPDATE users SET age = 24 WHERE ID = 123;
同样,可以使用UPDATE更新多个字段的值MysqL应用
UPDATE users SET age = 24,name = 'Mike' WHERE ID = 123;
上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值
百万级其余数据,对于MysqL应该没有问题.MysqL应用
你这个sql的问题是,相当于修改ONE表里面所有记录的AGE信息,而修改的过程是,对于每一条ONE里面的记录,去TWO里面查询,再修改.而且,期间很可能会有锁之类的东西.
首先,这种sql不应该出现在业务逻辑里面,而应该是后台的job里面.
如果必定要这么做,可以试着用相反的方式,如果不一样的记录不是特别多,那就找到ONE表里面AGE记录跟TWO表不一样的记录,再修改,例如大概象下面(可能语法不太对):MysqL应用
update ONE,TWO set ONE.AGE=TWO.AGE where ONE.ID=TWO.ID AND ONE.AGE != TWO.AGE
当我把数据调到了1000W就更新不了了,下面我来分析原因.
实例:必要根据用户日志的ip地址计算出其地理地址
表结构:
用户日志表(200万条记录),其中address是待填充的字段:MysqL应用
CREATE table `tmp_open_ip` ( `email` varchar(60) NOT NulL DEFAulT '',`address` varchar(50) NOT NulL DEFAulT '',`ip` int(10) unsigned NOT NulL DEFAulT '0',KEY `email` (`email`),KEY `ip` (`ip`)) ENGINE=MyISAM DEFAulT CHARSET=utf8
另ip地址数据库表(44万条记录)MysqL应用
CREATE table `ip` (`s` int(10) unsigned NOT NulL DEFAulT '0' COMMENT '开始ip',`e` int(10) unsigned NOT NulL DEFAulT '0' COMMENT '结束ip',`a` varchar(50) NOT NulL DEFAulT '',KEY `s` (`s`),KEY `e` (`e`)) ENGINE=MyISAM DEFAulT CHARSET=utf8
必要根据用户日志表 tmp_open_ip 里的 ip字段到ip地址数据库表里查询出对应的地理地址,将地址填充到address字段.
使用如下update语句执行:MysqL应用
UPDATE tmp_open_ip AS u INNER JOIN ip ON u.ip BETWEEN ip.s AND ip.e SET u.address = ip.a
在笔者的电脑上运行了速度非常之慢,执行了一个多小时(4500s)都没有完,也不知道还要多久.
实在看不外去,于是想到使用insert 是否会快一些,于是重新导一张表 tmp_open_log 与tmp_open_log完全一致.
创建一张表 tmp_open_address,是insert的目标表,为了速度更快,没建索引:MysqL应用
CREATE table `tmp_open_address` (`email` varchar(60) NOT NulL DEFAulT '',`ip` int(10) unsigned NOT NulL DEFAulT '0') ENGINE=MyISAM DEFAulT CHARSET=utf8
执行insert 语句MysqL应用
insert into tmp_open_address (email,address,ip)select l.email,ip.a,l.ip from tmp_open_log as l inner join ip on l.ip between ip.s and ip.e ;/* Affected rows: 2,543,124 Found rows: 0 Warnings: 0 Duration for 3 querIEs: 16.922 sec. */
不到17s!原来还想去倒杯水、稍事休息一下,结果已经执行完毕.MysqL应用
到本文写完时,前面的update语句已经执行了5000s,结束仍是遥遥无期.
所以,对于大数据量执行update时,可以考虑改用insert 语句实现,可能麻烦一些,但高速带来的收益远大于麻烦!
跋文:
直接杀死了update进程,去看看update执行了多少:运行
MysqL应用
SELECT * FROM `tmp_open_ip` where address!=''
成果只有 11,373,照这个速度,要运行N天....MysqL应用
《MysqL入门MysqL中UPDATE语句使用的实例教程》是否对您有启发,欢迎查看更多与《MysqL入门MysqL中UPDATE语句使用的实例教程》相关教程,学精学透。内存溢出PHP学院为您提供精彩教程。
总结以上是内存溢出为你收集整理的Mysql入门MySQL中UPDATE语句使用的实例教程全部内容,希望文章能够帮你解决Mysql入门MySQL中UPDATE语句使用的实例教程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)