› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
b00tyhunt3r
V2EX  ›  MySQL

如何每个月“缓存”一次 mysql 的查询结果?

  •  
  •   b00tyhunt3r · Mar 23, 2021 · 4357 views
    This topic created in 2020 days ago, the information mentioned may be changed or developed.
    需求:

    现有一个监控某款商品销量的后台网站,每售出一件该商品,记录进表。golang template 后端。

    因为表非常之巨大,每 query 一次非常耗时。
    又因为老大对此款商品销量的监控,实时性要求不高,


    故 leader 希望只在每个月最后一天查询一次 DB,更新这个月的销量,然后把查询结果缓存在某个地方,
    显示在后台网站上,以供这个月随时查看。


    后台网站的界面是,选择某年某个月份,可以列出当月,此款商品的销量状况。




    -----------------



    不太明白的点,

    1.每月 1 次查询 DB 的结果缓存在哪,

    2.具体以什么形式缓存,如何缓存

    3.如何做到每个月只查询,更新缓存一次?

    4.redis 能否实现上述需求?


    诚谢大佬解救!!!!!!!!!!
    18 replies  •  2021-03-24 17:05:08 +08:00
    redtea
        1
    redtea  
       Mar 23, 2021   ❤️ 1
    MySQL 增加一张表,销售月度表,MySQL 里增加定时任务查询当月销量写入该表,需要查询时只要查询该表就可以了。
    airyland
        2
    airyland  
       Mar 23, 2021   ❤️ 1
    redis 或者数据库保存都可以,具体看数据量。保存商品 id 日期 数据。
    用定时任务,或者可以用最简单的请求触发逻辑:如果当月请求不到上月数据缓存,说明还未缓存,执行查询并保存缓存。
    fuis
        3
    fuis  
       Mar 23, 2021
    随便写个定时任务存 redis 里呗
    xiaoxinshiwo
        4
    xiaoxinshiwo  
       Mar 23, 2021
    感觉题主啥也不懂啊
    b00tyhunt3r
        5
    b00tyhunt3r  
    OP
       Mar 23, 2021
    @airyland
    @fuis
    @redtea
    感谢回复!

    想问一下用 redis 的情况,
    不太理解的是,
    譬如我今天查到的数据存进 redis 里面了,
    但因为商品每天都在卖,明天 DB 里肯定会有新的数据变动,
    然后明天我通过后台网站看销量,后台网站访问 redis 拿数据,结果 redis 发现 DB 里面数据更新了,
    这时候 redis 不是又要去访问 DB 了?

    和每个月只访问一次 DB 的需求有冲突?

    redis 小白说错勿怪
    chniccs
        6
    chniccs  
       Mar 23, 2021
    一个月一次,查出来你做 excel 吧。简单不。
    lithiumii
        7
    lithiumii  
       Mar 23, 2021   ❤️ 1
    假如没有退货之类的问题需要处理
    每个月一号查询上个月的销量,查完存起来不用动了,一辈子都不用改
    你今天新增的销量要到下个月一号才会被查询和更新
    b00tyhunt3r
        8
    b00tyhunt3r  
    OP
       Mar 23, 2021
    @lithiumii
    是这个意思 但就是“查完存起来” 不知道如何实现
    lithiumii
        9
    lithiumii  
       Mar 23, 2021   ❤️ 1
    用 Redis 我觉得没必要
    就请你们的 MySQL 数据库的 DBA 新建一张表,叫每月销量(当然具体表名建议符合规范来,比如 monthly_sales )
    然后一列是月份,一列是销量数字,其他的列比如自增 id 、创建日期之类的等等建议按你们的规范来。然后你每月跑一次查询写进去就行了。

    当然你一定要用 Redis 也行,就是 Redis 里面把过去每个月的数据存下来。自己查 Redis 怎么运行,怎么存储
    limuyan44
        10
    limuyan44  
       Mar 23, 2021   ❤️ 1
    新建个表就好了,redis 一点都不适合你这个场景,用了 redis 你数据还是要落地的,还是得建表,干嘛不直接建表,一个月一次的统计表能有多大的性能消耗。
    v2NPC
        11
    v2NPC  
       Mar 23, 2021
    mysql 新建表+1
    b00tyhunt3r
        12
    b00tyhunt3r  
    OP
       Mar 23, 2021
    @limuyan44
    好的老哥 已经决定新建表了。
    btw 你这头像是本人吗?练了多久?
    dayeye2006199
        13
    dayeye2006199  
       Mar 23, 2021
    你这个就是个数据 ETL,把这个查询过程,做一个每个月的定时任务,得到的结果写入一张新表;报表查询,直接查这张新表就行了。
    ch2
        14
    ch2  
       Mar 23, 2021
    @b00tyhunt3r #5 redis 不会主动访问别人,它只会返回你给它的东西
    gBurnX
        15
    gBurnX  
       Mar 23, 2021   ❤️ 1
    1.一张表拿来做流式计算的统计,一张表拿来存历史数据。

    2.流式计算的表,意思是,把一个数据结构,转化为只有一条数据的一张表。表里的某个字段用于记录当前商品的销量。当爬虫更新商品页面时,把最新的销量,更新到该数据的相关字段里。

    3.历史数据表,用于爬虫更新商品页面时,把获取到的销量数据,insert 进去。

    4.流式计算表拿来实时输出需要的统计数据,无论什么时候取都行,不一定非要等每月月末;历史数据表拿来做离线分析数据统计。
    symons
        16
    symons  
       Mar 24, 2021
    可以考虑 Hive 表存储+BI 的方式来做
    julyclyde
        17
    julyclyde  
       Mar 24, 2021
    redis 不会“去发现”db 更新了
    zhangysh1995
        18
    zhangysh1995  
       Mar 24, 2021
    问题是怎么做:简单方法, 触发器+dump
    问题是太慢,存不下:性能优化,加硬盘,减少存的信息
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   825 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 22:08 · PVG 06:08 · LAX 15:08 · JFK 18:08
    ♥ Do have faith in what you're doing.