[原] SQL 查询优化,子查询

场景

假设表 table_snapshot 表 为一个电商系统库存的快照表,里面有 goods_id,num,time 等字段。快照数据大约为50W。其中 goods_id 字段,其上未加索弓丨,不同的goods_id有大约3000个。 

要求

指定了 250个goods_id,要求判断其中多少个在 table_snapshot 表中出现过。 

Continue reading

MySQL | wwpeng | | (0) |

[原] MySQL 如何让一个字段的值不能被减为负数

当用数据库存储一个数值,并且这个数值需要被增减的时候,比如物品的数量。

在这种场景下,物品的数量是不能为负数的。那如何确保在扣减这个数量的时候,不会被扣成负数呢。

假设表数据如下: 

sku num
a 10
b 20

假设现在 a 的 num 要 减少10个。

用程序在操作之前判断? num 是否足够扣减 ? 这明显是不靠谱的。因为有并发的情况存在。

在并发的情况下,a 的 num 会变成 -10 当然,前提你的 sql 是这么写的:

UPDATE table SET num=num-10 WHERE sku="a"

绝对不能用程序去计算 num 的值,在赋值到 sql 中,在并发情况下  num 会变成 0,错误示例:

$data = 'select * from table where sku="a"';
$num = $data['num'] - 10;
UPDATE table SET num=$num WHERE sku="a"

Continue reading

MySQL | wwpeng | | (0) |