MySql 对于两亿的大表(主要用来读),有什么有效的优化参数设置的方法?

理由
举报 取消

现在有一个表大概有2亿条数据,8个column,描述如下:A longinteger, 不为空 (unique)B int, 不为空,(非unique)C int 不为空(非unique)D timestampE text 不为空F text 不为空G int 不为空H text,可能为null。需要依据BDH作为 查询条件搜索数据返回A,C,F/E,G,要求达到的吞吐量为至少20000 rps。请问各位专业人士有没有详细一点的建议,比如加index给哪个column加,用MyiSAM还是MyInnoDB,调my.cnf的参数应该key_buffer_size多少比较合适,thread_pool size 要开到多少?希望尽量优化mysql的性能,我的硬件环境如下:Ubuntu, Memory 8G, vCPU 2, 最多可以开5台机器作为后台,5台机器作为前台。希望有经验的大神多多赐教。

2017年5月25日 10 条回复 1060 次浏览

回复 ( 10 )

  1. 呼延平
    理由
    举报 取消

    Mysql千万级别就瓶颈了~好奇为什么三个text而不是两个varchar一个text~

    建议水平拆表,程序做路由结果合并排序,并发查询多表

  2. 匿名用户
    理由
    举报 取消

    拆表呀,还等什么。

  3. 雨生
    理由
    举报 取消

    主要读的话 就把数据loading 到redis

    mysql 千万以后 就会有很严重的问题

    还有 ,搞那么多的text 还不限够麻烦么

  4. 廖强
    理由
    举报 取消

    关于索引,查询条件为B、D、H,mysql在对建索引时,对索引的长度有限制,由于你的H字段为text类型,所以无法用H作用索引,在改变表结构的情况下,索引可以用B和D的联合索引;关于H可以有一个优化手段,在表中新增一个bigint的字段Z,用来存在H的md5值,查询时,把H的md5值计算出来再一起查询

    关于存储引擎,还是选择innodb。因为innodb锁的粒度较小,如果业务存在增删改,锁表对性能的影响很大

    关于mysql参数上,尽量将innodb_buffer_size调大,将尽可能多的数据装载到内存中,对查询效率的影响较大;thread_pool_size根据你的并发情况进行调整,开到一两百问题不大;如果是需要更快的速度,而不考虑崩溃时恢复的速度,可以把innodb_log_file_size调大;innodb_flush_method可以调整为direct模式;其他基本默认参数就好了

    关于操作系统的参数上,尽量关掉vm.swappiness

  5. 匿名用户
    理由
    举报 取消

    不是社工库吧。。。

  6. wy Lament
    理由
    举报 取消

    现在有一个表大概有2亿条数据,8个column

    ————————-

    拆表,纵拆横拆看你们的需求,拆到千万级。

    根据业务逻辑适当重写SQL

    在查询时最常用的列上加索引OR联合索引

    如果发现要加的索引太多,适当引入中间表。

    那几个TEXT的字段…

    引入缓存:memcache还是REDIS 根据你们数据的特点来。

    ————————-

    再细就花钱请顾问吧。

  7. 国士无双
    理由
    举报 取消

    祭出神器 sphinx

  8. 用户头像
    理由
    举报 取消

    才两亿啊,200m,每条算他1k,不过才200g,十万级别的server就能全进内存了吧? 轻轻松松

  9. 朱涵俊
    理由
    举报 取消

    读的话加memcache。数据库上可以做主备,备份服务器用来做读服务器负载。

    读多的还是myisam好

我来回答

Captcha 点击图片更换验证码