qq_34771955
且听聆讯
2019-07-09 10:15
采纳率: 66.7%
浏览 4.7k
已采纳

MySql 千万级数据量 查询很慢

图片说明

图片说明

如图:numberrecord 表 3600W数据量。
需求是去重掉 time 与 number一致的数据。 我用的去重插入复制表的方法。
目前已经执行12个小时了,一夜没睡。
试过用java去处理,多线程分页查询去重,jvm直接崩溃。
图片说明

VM options : -Xms5000m -Xmx8000m 电脑内存16G的

问题2就是3600W数据
SELECT number FROM numberrecord where time <'2019-07-08' group by number
需要查询出 2019-07-08之前的所有number数据. 这个sql 如何优化。
time,number都有索引
求大牛给个高效率解决方案。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • qq_34771955
    且听聆讯 2019-07-17 10:43
    已采纳

    按月分表完美解决问题

    点赞 评论
  • caozhy

    对time列做索引,time列使用timestamp类型存储,千万不要字符串,还不行的话,分库份表查询再union

    点赞 评论
  • qq_18630487
    真-酸辣土豆丝 2019-07-09 11:35

    首先这么复杂和数据量大的操作是一定不能放在SQL中来实现。
    应该考虑在代码中分页实现,你在代码中报错只是因为没写好而已。
    思路大概是:对应表建好索引。分页十万条查询去重后的数据,循环查询分1万条批量插入。

    还有类似记录日志统计的数据,应该考虑放在mongodb上

    点赞 评论
  • chinarealone
    chinarealone 2019-07-09 14:59
    1. 这种去重方案,本身不合理。在sql查询中,所有否定谓语,如not like, not in, not exist都不能应用索引
    2. 去掉重复,可以考虑采用distinct或者group by实现
    3. 数据量巨大,考虑按时间分区或分库分表,然后在分组查询和合并
    点赞 评论
  • wl1411956542
    wl1411956542 2019-07-09 18:20

    使用时间索引,程序中按天进行查询,where条件必须是指定的天,不能是时间范围

    点赞 评论
  • qq_41695498
    宋平州 2021-01-10 12:02

    问题2的查询如果加上分页的话就会很快出来,用户不会一次展示上千万条的数据,

     

    点赞 评论

相关推荐