苛求各位开发大佬来指导

2023-02-09 12:19:25 +08:00
 chenhua19940128

遇到一个面试题:

题目:假设有 100 个分类,每个分类下有至少 1000 个商品,请实现一个分页程序,要求根据客户端给定的分类 ID 和排序字段,返回下一页的数据
代码使用 php 实现,可以依赖 Laravel 实现。其他组件如 Mysql 、Redis 等等没有限制。如果实现困难,排序字段可以假设只有一个。

要求:程序运行效率较高,在商品数达到百万级别的情况下,也能高效运行
提示:直接使用一行 sql 查询到结果的方式是无法满足高效运行的,会出现慢 sql

方法示例:

/**
 * @param int $categoryId 分类 ID
 * @param string $sortField 排序字段
 * @param int $page 当前第几页
 * @param int $perPage 每页数量
 */
public function nextPage(int $categoryId, string $sortField = 'price', int $page =1, int $perPage=20)
{
    ....
}

现在能想到的是先给字段加特定的索引,但是也是一条 sql 就出来了,redis 其他的没用到,请问下如何更高的提高效率

假设表结构是这样的

     * --------------
     * id | goods_id | category_id | price | created_at | updated_at
     * -------------
748 次点击
所在节点    问与答
3 条回复
chenhua19940128
2023-02-09 12:21:59 +08:00
如果直接用 order by ,效率会非常低下
yxisenx
2023-02-09 13:41:13 +08:00
用 es
sss15
2023-02-09 14:00:38 +08:00
就单表来说,百万级别根本不是事,且表字段也很少,连回表都不用,直接索引查出 goodsId 就好了,顶天一页 100 条数据,100 个 goodsId 去 goods 表中查询,此时可以引入 redis ,查过的 goodsId 就不用查了。

不知道这样子面试官是否满意

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/914531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX