分享

使用 MySQL 的条件判断实现大小值判断

 昵称xEu4P 2007-01-17

使用 MySQL 的条件判断实现大小值判断

@由 DIrk 发表于 2007-01-05 Friday

如果在 MySQL 中使用了 InnoDB 引擎,那么对于常规的 COUNT (id) 等操作非常耗费资源,速度比较慢,为了保持效率,需要将这些数据行的统计值保存起来,使用的时候直接查询获取就可以了。比如一个 BBS 系统中需要将每个论坛板块的主题数量和回复数量作为一个字段保存到相应的板块信息表中;如果主题和回复变动不频繁,那么对这个统计值的操作也不频繁,每次使用 COUNT (id) 重新查询还是可行的,但如果面对的是一个大型 BBS,不仅数据量巨大,而且用户数巨大引起主题和回复更新非常快,频繁的对巨量数据调用 COUNT (id) 查询,在性能上是不太现实的;所以,对于频繁更新的统计值,我们可以采用另外一种方法:直接加减。也就是说,如果增加了新主题,针对主题的统计值进行加一操作,反过来,删除主题,进行减一操作。

在 实际使用加减法更新统计值的时候,总有可能会发生统计值不正确的时候,特别是当统计值已经是零的时候如果再次减一,就会变成无法接受的错误:负值;如果你 将统计值字段定义了 unsigned,-1 会变成该字段的最大值(二进制取反引起的),也是无法接受的。这个时候,我们需要一个 SQL 函数,实现类似编程语言中 Max() 函数的功能,将这个统计值最小控制在 0。

在 PostgreSQL 中,有一个叫 greatest 的条件函数,可以让我们通过以下 SQL 语句避免统计值出现负值:

UPDATE dd_stml_stat SET stat_value=GREATEST(stat_value-1,0) WHERE stat_id=10;

可惜的是,在 MySQL 中并没有对应的函数,不过 MySQL 有一个叫 IF() 的特殊 Control Flow Function,可以使用它来实现我们的目标:

UPDATE dd_stml_stat SET stat_value=(IF(stat_value>1,stat_value-1,0)) WHERE stat_id=10;

其实这个 IF() 函数就是一个简单的判断器,它会判断第一个参数是否成立,如果是 True,就会返回第二个表达式的值,如果是 False,会返回第三个表达式的值;从而变相的在 MySQL 中实现了大小值比对函数。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多