查看: 2905|回复: 20
|
MySQL update statement 应该加 LIMIT 1?
[复制链接]
|
|
本帖最后由 jasonmun 于 6-1-2012 10:07 AM 编辑
最近在研究 MySQL optimization 的问题..
其中发觉到 UPDATE SQL 其实可以加上 LIMIT 1,
让他只更新一行数据..
其好处可想而知..
1. 如果程序只需更新一行时用, 不需去load整个 table.. 更新完一行就结束.. (速度加快了)
2. 保护数据. 当程序有问题的时候, 不会错误将所有数据更新..
但在网上有公司DBA却觉得这多此一举.. 觉得不应该加上..
你又觉得呢? |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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了,照理来说是会变慢点的。 |
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 18-1-2012 09:55 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 18-1-2012 09:58 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 18-1-2012 10:14 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 18-1-2012 10:34 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|