› 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
Alucns
V2EX  ›  MySQL

单表 5 千万计划分表,想知道分表后如何分页?

  •  
  •   Alucns · Apr 3, 2018 · 11929 views
    This topic created in 3100 days ago, the information mentioned may be changed or developed.
    单表 5 千万了,数据量也继续上涨,想把表拆分成 10 个;
    article_comments_0
    article_comments_100
    我现在想统计一下总数都得这样查询:
    function get_count_comments() {
    $aid = 0;
    for($i = 0; $i < 100; $i++) {
    $num += $this->db->result("SELECT COUNT(*) FROM article_comments_'.(string)$i);
    }
    return $num;
    }
    for 100 次呀,列表还没查呢,还有没更好的方法?

    列表分页有什么好的解决方案,期待 V2 高手解答一下;
    21 replies  •  2019-07-23 15:33:16 +08:00
    huyi23
        1
    huyi23  
       Apr 3, 2018
    没有,下一个
    murmur
        2
    murmur  
       Apr 3, 2018
    分表 count 本身就很蛋疼 计数器必须单独存一个字段里 我记得是 innodb 和 myisam 有一个 count 得行扫的 千万级刚得住?
    hcymk2
        3
    hcymk2  
       Apr 3, 2018   ❤️ 1
    请不要土法上马,找个中间件,或者用 mysql 的 partition
    jy01264313
        4
    jy01264313  
       Apr 3, 2018
    merge 引擎可以把表逻辑合并在一起
    woodface2233
        5
    woodface2233  
       Apr 3, 2018 via iPhone
    这在每个公司都算是核心技术了吧
    capric
        6
    capric  
       Apr 3, 2018 via Android
    二次查找,获取全局视野,修正 offset
    fox0001
        7
    fox0001  
       Apr 3, 2018 via Android   ❤️ 1
    其实,有用户会关心 5 千万的总数,或者总页数吗?楼主会不会被自己的设计坑了?

    总的来说,还是取巧吧。

    1 ) N 年前的数据一般没人关心,可以只把近期的数据取出来做分页。例如近几年的数据。

    2 )采用异步任务获取数据。比如界面新建任务,后台用定时任务查询数据,任务结束后通知用户

    3 )采用缓存,记录总的数量。如果记录是固定的,甚至每页的数据 ID、标题都可以缓存起来。具体要看某条数据的内容,拿 ID 去查数据库。

    4 )确实要五千万实时查询,可以借助其它系统或工具,这就不是一个 MySQL 能简单处理的了。例如 Solr、Hadoop 等

    具体还是要看楼主的需求。
    jixiangqd
        8
    jixiangqd  
       Apr 3, 2018
    partition 正解。。。
    realpg
        9
    realpg  
       Apr 3, 2018
    问 dba 去

    理想状态,这种库上的触发器都应该一大堆 用来维护各种人工辅助数据
    iyaozhen
        10
    iyaozhen  
       Apr 3, 2018   ❤️ 1
    几亿条内数据用 MySQL 自带的 partition 足够了,注意选好表分区字段,查询的时候必须带上。当然你要直接这样 count 谁也救不了你
    Alucns
        11
    Alucns  
    OP
       Apr 3, 2018
    @fox0001 谢谢,学习了,我也是这样想,把数据按年拆分出来;
    article_comments_2005
    ~
    article_comments_2018
    按年拆分,然后根据不同的时间去检索,有人试过没?
    ty89
        12
    ty89  
       Apr 3, 2018
    很好奇到底是什么需求,需要把几千万的数据翻页看完
    Alucns
        13
    Alucns  
    OP
       Apr 3, 2018
    @ty89 其实也不是全部需要翻页;
    大致需求就是用户信息推送围绕关注,如关注某个人,某个话题,某个文章,某个新闻,这样的逻辑就需要把所有旧的数据聚合起来,然后分页显示;
    snail00
        14
    snail00  
       Apr 3, 2018   ❤️ 1
    第一, hash 平均分一下, 统计一个表的数量, 不超过 50w, 再乘表个数就行.

    第二, 每个表 50w 条, 整个中间表, 维护这些表的信息, 一个表满了, 换下一个, 方便扩充, 表的信息找中间表查.

    第三, 用中间件, 数据库只做精准查询.

    第四, 冷热数据分开, N 长时间没人看的数据打包到一个表, 加个自增字段维护.
    opengps
        15
    opengps  
       Apr 3, 2018   ❤️ 1
    五千万建议先考虑表分区
    crazyneo
        16
    crazyneo  
       Apr 3, 2018   ❤️ 1
    首先,单表 5000 万并不需要分表,极端一点的情况就是考虑下表分区。
    其次,不要在 5.7 版本以前的 MySQL 中执行 count,无解,带条件尤甚。
    5.7 的 InnoDB 提供了 records 接口统计,https://dev.mysql.com/worklog/task/?id=6742
    以及官方提及的“ The next worklog, WL#6605, is intended to return the COUNT(*) through this handler::records() interface almost immediately in all conditions just by keeping track if the base committed count along with transaction deltas ”
    linyinma
        17
    linyinma  
       Apr 4, 2018
    楼主在说什么呢,表太大就想到的是拆表,思路是正确的, 但怎么可能是脱离业务需求,采用平均拆表这种小学生的都能想到的办法呢?

    得结合业务,比如日常查询条件频率进行拆分,如果所有的表都属于高频率查询范围,业务上可以采用间接的办法,比如结合 NOSQL 进行查询;

    总之一句话 单个再优秀程序也是禁不起不假思索的使用,合理的利用工具也是非常重要的
    Alucns
        18
    Alucns  
    OP
       Apr 4, 2018
    你们有人用过 TIDB 分布式 NewSQL 数据库么,它的数据结构和语法和 MYSQL 差不多呀。
    我一直在看,是不是把数据转到这里会不会好一些,就不用再分表了;
    xiebruce
        19
    xiebruce  
       Apr 29, 2019
    有点好奇边缘数据怎么处理,假如一页 10 条,其中几条在前一个表,有几条在后一个表,怎么处理?哈哈
    Alucns
        20
    Alucns  
    OP
       Apr 29, 2019
    @xiebruce 我以前是这么做的,如果是列表,我都是输出数据再写入临时表,一般存几十页,如果有更新再处理
    现在没按这方式处理了,好麻烦
    xiebruce
        21
    xiebruce  
       Jul 23, 2019
    @Aluhao 那现在怎么处理?😄
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1119 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 17:38 · PVG 01:38 · LAX 10:38 · JFK 13:38
    ♥ Do have faith in what you're doing.