佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2905|回复: 20

MySQL update statement 应该加 LIMIT 1?

  [复制链接]
发表于 6-1-2012 10:05 AM | 显示全部楼层 |阅读模式
本帖最后由 jasonmun 于 6-1-2012 10:07 AM 编辑

最近在研究 MySQL optimization 的问题..

其中发觉到 UPDATE SQL 其实可以加上 LIMIT 1,
让他只更新一行数据..

其好处可想而知..
1. 如果程序只需更新一行时用, 不需去load整个 table.. 更新完一行就结束.. (速度加快了)
2. 保护数据. 当程序有问题的时候, 不会错误将所有数据更新..

但在网上有公司DBA却觉得这多此一举.. 觉得不应该加上..
你又觉得呢?
回复

使用道具 举报


ADVERTISEMENT

发表于 6-1-2012 11:39 AM | 显示全部楼层
很奇怪的用法。。。
但是如果你只要update一个record而已的话。。。那mysql会知道你要update那里一个吗?如果那时有1个以上的record ngam 这个update statement的话
回复

使用道具 举报

 楼主| 发表于 6-1-2012 12:03 PM | 显示全部楼层
很奇怪的用法。。。
但是如果你只要update一个record而已的话。。。那mysql会知道你要update那里一个吗?如 ...
小陈陈 发表于 6-1-2012 11:39 AM


我现在说的是一个 table 已经知道每次只会更新一行的数据..
这设计是很普遍的.. 如 User table.. 已经知道每个 User 只用一行..
回复

使用道具 举报

发表于 6-1-2012 07:52 PM | 显示全部楼层
个人觉得在在试SQL STATEMENT的时候有用吧。以防UPDATE错误。
至于系统出错而导致UPDATE错误,这个可能性很小吧,所谓GIGO(GARBAGE IN GARBAGE OUT)。不过多加一句无妨,反正没吃亏,有杀错无放过
回复

使用道具 举报

发表于 17-1-2012 10:56 PM | 显示全部楼层
让我来做个试验
如一个worker table 拥有20000 record 和 id 是从 10020 到 30019



/*------ 1/17/2012 10:51:50 PM --------*/

UPDATE
  `worker`  
SET
  `name` = 'name_modify2',
  `address` = 'address_modify2',
  `picture1` = 'picture1__modify2'

WHERE
  `worker id` BETWEEN 10020 AND 30019;


/* Result : "Query OK, 20000 rows affected (1.750 sec)" */


/*------ 1/17/2012 10:54:02 PM --------*/

UPDATE
  `worker`  
SET
  `name` = 'name_modify1',
  `address` = 'address_modify1',
  `picture1` = 'picture1__modify1'

Limit 20000;


/* Result : "Query OK, 20000 rows affected (3.578 sec)" */


/*------ 1/17/2012 10:54:43 PM --------*/

UPDATE
  `worker`  
SET
  `name` = 'name_modify3',
  `address` = 'address_modify3',
  `picture1` = 'picture1__modify3';

/* Result : "Query OK, 20000 rows affected (1.610 sec)" */


结论:如用limit keyword, 死得惨点。。。
回复

使用道具 举报

 楼主| 发表于 17-1-2012 11:52 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

Follow Us
发表于 18-1-2012 01:57 AM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

发表于 18-1-2012 04:00 PM | 显示全部楼层
没有必要shoot人家啦,人家用另外一个方法来测试而已,limit 1很小,很难测试的。

不过以common sense的话,像你说的user只用一行的话,那么都应该set 了primary key。 有了primary key, 功能就和limit 1一样了,scan 到要的就自动stop了啦,也不会load完整个table。 多加limit 1变成多此一举,多了一个instruction, 在转换的时候,是多了几个instructions了,照理来说是会变慢点的。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 18-1-2012 05:02 PM | 显示全部楼层
回复 8# littlepenguin

1. 谁说很难测试的.. 我们只是看它的回应时间/速度而已.
写 LIMIT 20000, 根本上已经失去测试的意义..

2. 以上已排除用 WHERE PRIMARY KEY
回复

使用道具 举报

发表于 18-1-2012 05:08 PM | 显示全部楼层
回复 9# jasonmun


   如果是没set primary key的话, 个人觉得应该会加快速度吧。
回复

使用道具 举报

发表于 18-1-2012 07:43 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

 楼主| 发表于 18-1-2012 08:23 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

发表于 18-1-2012 08:49 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

 楼主| 发表于 18-1-2012 09:23 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

发表于 18-1-2012 09:49 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

 楼主| 发表于 18-1-2012 09:52 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报


ADVERTISEMENT

发表于 18-1-2012 09:55 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

 楼主| 发表于 18-1-2012 09:58 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

发表于 18-1-2012 10:14 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

 楼主| 发表于 18-1-2012 10:34 PM | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 3-5-2024 11:14 PM , Processed in 0.078903 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表