代码实践之Job如何从MySql获取数据

3 篇文章 0 订阅
3 篇文章 0 订阅

相信很多人都写过Job,特别是对于从MySql进行大数据量(百万级、千万级甚至亿级)的频繁读取,在这种场景下如何从数据库查询数据就不是一个简单的问题了,查询效率至关重要!

我们先看一下最常见也是应用最广泛的写法:

select * from tableName where ... limit m,n;

这种写法对于用户从前端读取数据的场景下是满足需求的,因为m和n的值都不会很大,最多两位数,但是对于跑Job来说却存在隐患,想象一下,前期m还小的情况下跑着是没问题,如果m的值增长到1千万甚至1亿了呢?对于这样一个查询语句,MySql会根据where条件查出1千万+n条或者1亿+n条数据,然后再取后面n条,把前面的数据全都抛弃掉,假如n=1000,你想想你为了取这一千条数据,却要扫描1千万或者1亿行无用的数据,这效率能高吗?况且在Job中如果是多线程的情况下,你还不止一条线程在取这样的数据,可能是多条线程在执行这样的查询,压力山大呀!MySql很可能会崩掉哦!

危言耸听了这么久,也该说说解决方案了,改进写法如下:

select * from tableName where ... and pkId > x limit n;(pkId是主键)

虽然说改动不大,但是效果却千差万别,对于这条语句来说,相当于永远只取第一页n条数据,而limit m的工作就由pkid>x来代替了,pkId作为主键,查询效率是极高的,整个语句的查询效率也大大提升了!

其实如果给这篇博客换一个名字,还可以叫“limit
语句的优化方案”,这边博客归根结底就是对于limit语句的优化以提高查询效率,但是使用的时候需要看是否满足这样查询的潜在条件,例如是按照pkId升序查询,如果是特殊的排序方案在进行相应改造即可!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值