为什么社交网络中的数据页面转换技术比较复杂?
最近讨论的一个传统问题是,问题本身相对简单,对于关键列表类型的数据,如何优化方案以实现性能和成本的权衡。密钥列表在社交产品和面向用户的产品中非常常见,例如用户的朋友关系{uid:{1,2,3,4,5}},表明uid有1,2,3,4, 5个朋友;微博下的评论ID列表的结构是{weibo_id:{comment_id1,comment_id2}},用户发布的微博ID列表,依此类推。
当列表长度较小时,可以直接使用数据库的翻页功能,如
SELECT * FIBROMISTTABLELIMIT offset rowcount;
根据经验,在大多数情况下,单个服务的案例长度为99%,并且当数据大小较小时,上述方法非常适合。但是,在剩余的1%情况下,数据可能多达100万。当数据大小很大时,当访问具有大偏移的数据集时,上述方法效率非常低。但是,在考虑解决方案时,不能忽略这些非常大的数据集的问题。因此,为了实现适用于各种可变长度列表场景的翻页解决方案,该行业没有简单有效的解决方案。这也反映了经常被称为优化20%功能的80%的时间。
访问列表数据有两种常见方法
1. 扶梯方式
自动扶梯模式在导航中通常只提供前一页/下一页的两种模式,有些产品甚至不提供前一页功能,只提供更多/更多的模式,也有更多的自动加载方式,从技术上可以归纳为自动扶梯模式。
(图:blogspot的导航栏)
(图:许多瀑布流产品只提供更多的导航栏)
自动扶梯法在技术实施上简单有效。根据当前页面的最后偏移量可以获得一个页面,下面的方法可以在MySQL中使用。
SELECT * FROM LIST_TABLE WHERE id offset_id LIMIT n;
由于位置是在WHERE条件下指定的,根据B-树实现原理,算法复杂度为O(log n)。
2. 电梯方式
另一种数据获取方法在产品中体现为准确的翻页方法,例如1、2、3n,同时,还可以由用户在导航时直接输入到n个页面。中国大多数产品经理对电梯方法有特殊的偏好,如图所示。
(图片:timyang.net网站上的导航栏)
但是,当使用以下SQL时,电梯模式在技术实现中相对昂贵
SELECT * FIBROMISTTABLELIMIT offset rowcount;
我们可以使用MySQL解释来分析,如下所示,当offset = 10000时,MySQL实际上会扫描10,000行记录。