要求:钉钉群简介页面需要显示钉钉群名和简介,每个群成员的别名,以及钉钉的个人简介钉钉群主签名信息。需求中需要的信息存放在以下四个表中:user、user_profile、groups、user_group。方案一:先来看最简单的实现方式。一条SQL语句可以解决所有问题:SELECTname,description,user_type,nick_name,signFROMgroups,user_group,user,user_profileWHEREgroups.id=?ANDgroups.id=user_group.group_idANDuseruser_group.user_id=user.idANDuseruser_profile.user_id=user.id方案二:用稍微复杂一点的方法分两步搞定:首先获取钉钉群的所有相关信息和所有钉钉需要显示的组组成员别名信息和组成员类别:SELECTname,description,user_type,nick_nameFROMgroups,user_group,userWHEREgroups.id=?ANDgroups.id=user_group.group_idANDuseruser_group.user_id=user.id然后通过user_type找到组程序中上述结果集中的master的user_id然后从user_profile表中获取钉钉群master的个人签名信息:SELECTsignFROMuser_profileWHEREuser_id=?方案对比:以上两种方案最大的区别在于交互次数和SQL的复杂度。实际影响是第一种方案对user_profile表(不是群主的profile信息)进行了不必要的访问,导致IO访问量直接增加了20%左右。在实际应用中,IO操作是数据库应用系统中非常昂贵的资源。尤其是这个函数的PV很大的时候,第一种方案造成的IO损失还是挺大的。小结其实很多人都知道重复执行同一条SQL会造成资源浪费的问题,但是在应用系统开发的过程中,这种现象还是经常存在。主要原因是开发工程师思想中面向对象的概念太深,降低了自己代码开发的逻辑性,过分依赖程序接口造成的。
