V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
BeanYoung
V2EX  ›  MySQL

千万级表,读写相当频繁,该用什么思路去优化?

  •  
  •   BeanYoung · 2013-09-06 14:08:48 +08:00 · 5857 次点击
    这是一个创建于 3884 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题是这样的,有三张表,user, foo, bar。每张表的字段数都在10以上。其中foo量级在5000w,bar在20000w。这两张表的某些字段(每张表两个左右)每天都会更新一遍。foo表每天增加1w,bar表每天增加200w。foo.user_id = user.user_id, foo.foo_id = bar.bar_id。
    有上百台服务器,每台服务器有50个左右的mysql连接(无法做连接池)。数据库并发连接数在4000左右,且每个链接都是更新操作为主。
    目前的方案是,在mysql上通过thrift实现一层http的service,提供api,每台服务器来调用api进行数据更新。
    拆表方面,打算把user,foo和bar垂直拆表,将不需要更新的字段和需要更新的字段分开。必要时再将需要更新字段组成的表再做水平拆表。

    不知道大家有没有这方面的经验,欢迎大家提供更好的方案
    9 条回复    1970-01-01 08:00:00 +08:00
    master
        1
    master  
       2013-09-06 14:19:38 +08:00
    只是foo.user_id = user.user_id, foo.foo_id = bar.bar_id这样的关系的话,其实可以考虑下 NoSQL
    BeanYoung
        2
    BeanYoung  
    OP
       2013-09-06 14:28:44 +08:00
    @master 写错了,是foo.foo_id = bar.foo_id
    master
        3
    master  
       2013-09-06 14:37:53 +08:00
    @BeanYoung
    喔喔,其实主要看这些数据更新记录以后还需要什么样的查询,
    如果只是这种这种关系场景的更新我觉得用NoSQL没问题
    zhangrentina
        4
    zhangrentina  
       2013-09-07 07:36:37 +08:00
    水平拆表,读写用master slave分离。有ssd最好了
    saharabear
        5
    saharabear  
       2013-09-07 08:02:55 +08:00
    换个好硬件?
    yangqi
        6
    yangqi  
       2013-09-07 10:26:22 +08:00
    这个级别肯定要上mysql cluster了,去管网了解一下
    likuku
        7
    likuku  
       2013-09-08 01:12:56 +08:00
    一个master 只管写,「foo表每天增加1w,bar表每天增加200w」,这种普通硬盘RAID足够了。

    多个 slave 从 master 同步,最好都是ssd的raid,cpu 也要强,mysql 5.6 以前 slave 单线程从 master 同步,所以CPU和io要足够强才能即时追上master的更新速度。

    memcached 机群一定要用,有个日本人作的补丁,可以让多台 memcached 互相自动同步互备。
    likuku
        8
    likuku  
       2013-09-08 01:30:52 +08:00
    抱歉没看到「有上百台服务器,每台服务器有50个左右的mysql连接(无法做连接池)。数据库并发连接数在4000左右,且每个链接都是更新操作为主。」

    这个需求貌似在 mysql 上只有 6楼 @yangqi 讲的 “mysql cluster” 才可了。
    VYSE
        9
    VYSE  
       2013-09-08 02:00:03 +08:00
    @likuku 用CLUSTER的就要注意简单一句join foo.user_id = user.user_id这种千万级的数据,用完这辈子结果就能跑出来了。
    可能只有SCI的连接方案(没试过)解决。
    如果只是select/update一个表,倒是没啥大问题,只要注意ndb偶尔crash(log直接显示代码多少多少行有问题或干脆承认就是有个unknown bug会crash)时有个脚本负责花几十分钟冷重启就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5311 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:00 · PVG 16:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.