数据库中update怎么用事例_MySQL中UPDATE语句使用的实例教程
一、UPDATE常见用法首先建立测试环境:
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为'***'。
update t_test t
set t.password = '***'
where t.bs = 2;
2、set多个字段在表t_test中设置第一条记录(bs为1)的password为'*'、remark为'*'。
update t_test t
set t.password = '*', t.remark = '*'
where t.bs = 1;
3、set null值在表t_test中设置第三条记录(bs为3)的password为null、remark为null。
update t_test t
set t.password = null, t.remark = null
where t.bs = 3;
这个是按照标准语法写的,在不同的数据库系统中,update还有更多的写法,但是标准写法都是支持的。以上三个例子为了说明情况,每次都更新一行。在实际中,可以通过where语句约束来控制更新行数。
二、UPDATE使用中的相关性能问题以及解决方法UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, WHERE ;
如下面的语句将users表中id等于123的记录的age改为24
UPDATE users SET age = 24 WHERE id = 123;
同样,可以使用UPDATE更新多个字段的值
UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;
上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值
百万级别的数据,对于mysql应该没有问题。
你这个sql的问题是,相当于修改ONE表里面所有记录的AGE信息,而修改的过程是,对于每一条ONE里面的记录,去TWO里面查询,再修改。而且,期间很可能会有锁之类的东西。
首先,这种sql不应该出现在业务逻辑里面,而应该是后台的job里面。
如果一定要这么做,可以试着用相反的方式,如果不一样的记录不是特别多,那就找到ONE表里面AGE记录跟TWO表不一样的记录,再修改, 例如大概象下面(可能语法不太对):
update ONE,TWO
set ONE.AGE=TWO.AGE
where ONE.ID=TWO.ID AND ONE.AGE != TWO.AGE
当我把数据调到了1000W就更新不了了,下面我来分析原因。
实例:需要根据用户日志的ip地址计算出其地理地址
表结构:
用户日志表(200万条记录),其中address是待填充的字段:
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万条记录)
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语句执行:
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的目标表,为了速度更快,没建索引:
CREATE TABLE `tmp_open_address` (
`email` varchar(60) NOT NULL DEFAULT '',
`address` varchar(50) NOT NULL DEFAULT '',
`ip` int(10) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
执行insert 语句
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!本来还想去倒杯水、稍事休息一下,结果已经执行完毕。
到本文写完时,前面的update语句已经执行了5000s,结束仍是遥遥无期。
所以,对于大数据量执行update时,可以考虑改用insert 语句实现,可能麻烦一些,但高速带来的收益远大于麻烦!
后记:
直接杀死了update进程,去看看update执行了多少:运行
SELECT * FROM `tmp_open_ip` where address!=''
结果只有 11,373 ,照这个速度,要运行N天....
数据库中update怎么用事例_MySQL中UPDATE语句使用的实例教程相关推荐
- mysql中索引约束有哪些_Mysql中索引和约束的示例语句
外键 查询一个表的主键是哪些表的外键 SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCE ...
- MySQL中count是什么函数_MySQL中
本篇文章给大家带来的内容是关于mysql大表中count()的用法以及mysql中count()的优化,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.一个单表中包含有6000w+的数据 ...
- 如何使用python编程、字典中的get是什么_详细解析python字典get()实例教程
对于程序员而言,了解更多的算法,对自己的程序完善是非常有意义的,关于Get方法有小伙伴了解是如何使用吗?不了解的小编已为大家整理,一起来看下吧~ get()函数简介 get()是查找并返回字典中的某个 ...
- 数据库中update怎么用事例_Oracle的update语句set里使用子查询的例子解释
终于领略到oracle的强大,可能其他数据库的也可以.标准SQL? Update ds_wap_query_top_count c Set active_num = (Select nvl(activ ...
- mysql中给用户添加密码_MySql中添加用户,新建数据库,用户授权,删除用户,修改密码...
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- mysql update 批量修改数据_MySQL 中实现数据的批量修改
今天遇到一个数据的批量更新,查了一下官方文档,还好找到了.英文东东,大家耐心哈 http://dev.mysql.com/doc/refman/5.7/en/update.html 一般在使用数据编辑 ...
- mysql中创建用户并授权_MySQL中创建用户及授权[转]
GRANT 语句的语法如下: GRANT privileges (columns) ON what TO user IDENTIFIEDBY "password" WITH GRA ...
- mysql中如何去除重复数据_MySQL中如何删除重复数据只保留一条
在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断SELECT *FROM peopleWHERE p ...
- mysql中的锁的指令_mysql中的锁
MYSQL不同的存储引擎支持不同的锁的机制 MyISAM 支持表锁,InnoDB支持表锁和行锁 表锁,行锁比较 表锁:开销小,加锁快:不会出现死锁:锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销 ...
最新文章
- DIKW体系(Data-Information-Knowlege-Wisdom)
- CAS 单点登录 服务器整合
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...
- INTERSPEECH 2017系列 | 语音识别之语言模型技术
- Lambda表达式的基础知识
- 算法导论 练习10.4-5二叉树的遍历
- (day 29 - 二叉树的先序遍历 )剑指 Offer 34. 二叉树中和为某一值的路径
- BZOJ 4503 两个串 ——FFT
- daemontools的安装、示例、简介
- Power Apps 中调用 Automate 工作流
- 实验吧——安全杂项之“A记录”详解
- C numi和弓道 双指针(2020牛客寒假基础训练营1 )
- 聊一聊我们应该如何有效学习
- Salesforce(0):使用VsCode使用Aura组件并展示组件扩展
- maven中的一些依赖
- ITIL学习(六)服务战略之战略制定
- 金秋良田美画卷 国稻种芯·中国水稻节:江西1400万亩稻迎丰收
- 基于JAVA超市自助结账系统的设计与实现计算机毕业设计源码+系统+数据库+lw文档+部署
- 基于STM32F767通过STM32CubeMX实现ModbusTCP
- UE5学习笔记——我为什么要学虚幻引擎