在单个查询中组合 2 个更新查询 - 性能
Combine 2 update querys in a single query - performance
我正在编写一个最喜欢的函数。
例如我们有多个地址,可以选择一个作为收藏。
目前我有 2 个查询来完成这项工作:
UPDATE userdata
SET maindata = 0
WHERE
cid = :id;
UPDATE userdata
SET maindata = 1
WHERE
cid = :id AND id = :id2
LIMIT 1
在第一个查询中,我将所有地址设为 "no favourite",在第二个查询中,我将新选择的地址设为最喜欢的地址。
有什么方法可以改进这个查询或将两者重写为 1 吗?或者更好的解决方案?
如果您想要单个查询,您可以使用 case when(或 if)
update userdata
set maindate = case when id = :id2 then 1
else 0 end
where cid = :id;
为了性能请确保您在用户数据列 (cid, id) 上有一个正确的索引
并且扫描的行数对于第一个 wuary 应该是相同的..但是这样你就避免了第二个..
最终尝试创建一个复合索引
create index myidx1 on userdata(cid, id)
UPDATE userdata SET maindata = (case when cid = id AND id = id2 then 1 else 0 end);
这会有所帮助。我不确定您的查询,但这会有所帮助。如果您看起来不一样,请告诉我...
我正在编写一个最喜欢的函数。
例如我们有多个地址,可以选择一个作为收藏。
目前我有 2 个查询来完成这项工作:
UPDATE userdata
SET maindata = 0
WHERE
cid = :id;
UPDATE userdata
SET maindata = 1
WHERE
cid = :id AND id = :id2
LIMIT 1
在第一个查询中,我将所有地址设为 "no favourite",在第二个查询中,我将新选择的地址设为最喜欢的地址。
有什么方法可以改进这个查询或将两者重写为 1 吗?或者更好的解决方案?
如果您想要单个查询,您可以使用 case when(或 if)
update userdata
set maindate = case when id = :id2 then 1
else 0 end
where cid = :id;
为了性能请确保您在用户数据列 (cid, id) 上有一个正确的索引
并且扫描的行数对于第一个 wuary 应该是相同的..但是这样你就避免了第二个..
最终尝试创建一个复合索引
create index myidx1 on userdata(cid, id)
UPDATE userdata SET maindata = (case when cid = id AND id = id2 then 1 else 0 end);
这会有所帮助。我不确定您的查询,但这会有所帮助。如果您看起来不一样,请告诉我...