V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
websql
V2EX  ›  问与答

打开网站首页数据库 MySQL 查询次数的疑惑

  •  1
     
  •   websql · 2022-09-11 16:45:14 +08:00 · 911 次点击
    这是一个创建于 815 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据库只有一张表
    字段: 40 个
    行数: 30 万行

    字段 0 名: studentId
    字段 0 作用: 主键,记录 student 唯一 id

    字段 1 名: insertTime
    字段 1 作用: 记录插入 10 位时间戳

    字段 2 名: studentName
    字段 2 作用: 记录 student 名字

    字段 3 名: studentType
    字段 3 作用: 记录 student 的类型:{1:小学、2:初中、3:高中}

    字段 3 名: studentHome
    字段 3 作用: 记录 student 的家庭住址:城市,区域,街道,小区名称

    字段 3 名: studentHit
    字段 3 作用: 记录 student 的信息被查看次数


    首页第一部分需要展示
    查询语句:
    本周_属于**小区_所有小学生信息被查询次数_前 8 名的排行榜:
    "SELECT studentId, insertTime, studentName, studentImg FROM studentInfo WHERE studentType=1 AND studentHome LIKE '小区名称%' AND week(insertTime)=week(now()) ORDER BY studentHit DESC LIMIT 15;"

    本周_属于**小区_所有初中生信息被查询次数_前 8 名的排行榜:
    "SELECT studentId, insertTime, studentName, studentImg FROM studentInfo WHERE studentType=2 AND studentHome LIKE '小区名称%' AND week(insertTime)=week(now()) ORDER BY studentHit DESC LIMIT 15;"

    本周_属于**小区_所有高中生信息被查询次数_前 8 名的排行榜:
    "SELECT studentId, insertTime, studentName, studentImg FROM studentInfo WHERE studentType=3 AND studentHome LIKE '小区名称%' AND week(insertTime)=week(now()) ORDER BY studentHit DESC LIMIT 15;"

    本周_全省_所有学生信息被查询次数_前 15 名的排行榜:
    "SELECT studentId, insertTime, studentName, studentImg FROM studentInfo AND week(insertTime)=week(now()) ORDER BY studentHit DESC LIMIT 15;"



    我的疑问是:
    1 、如果首页需要展示的 5 个部分和上面第一部分类似,那么光是一个用户打开首页,就需要查询数据库 5(首页 5 个部分)*4(每部分 4 次查询)=20 次?

    2 、即使是针对相关的字段做了索引,查询时间也在 15 毫秒左右,按照疑问 1:如果是打开一次首页需要 20 次查询,那不就是需要 15 毫秒*20=300 毫秒,意味着即使不计算网络延时,单纯只是数据库查询都需要 300 毫秒,如果这样,到实际生产时完全不可用了,新人接触编码 3 个多月,能力暂时有限,特地求教各位大神有什么好的解决方案吗?
    gjquoiai
        1
    gjquoiai  
       2022-09-11 19:32:38 +08:00
    一来查询相互之间没有依赖关系的话可以并发去查,二来看上去都是统计数据完全可以容忍数据延迟,看能容忍多少定期查好了存起来就行
    summerwar
        2
    summerwar  
       2022-09-12 05:21:46 +08:00
    查数据库,然后结果存 redis 等缓存里,设置一个有效期,以后每次查询时先查缓存里有数据没,有数据直接返回数据,没有数据再去数据库查询,查询完继续存缓存里,设置有效期,以此类推
    websql
        3
    websql  
    OP
       2022-09-14 17:57:20 +08:00
    @gjquoiai
    数据是能容忍延迟的,只需要展现前一天的排行数据即可,不是要求实时的展现。
    不懂您说的并发查,能有代码示例,或者是搜索的关键词,提示一下吗?刚入门,知识体系不完善,谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3463 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:49 · PVG 19:49 · LAX 03:49 · JFK 06:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.