描述问题:
目前想用SQL语句来查询一个表(50万条),并将表内昵称为空的用户Openid拿出来,每百条查询一次。环境MySQL。
问题关键:
一次性取出,分百条查询,也会给服务器造成很大压力(*1),能不能让SQL查询出100条符合结果的记录,并返回最后一条的ID?
拓展:
除了我这种想法,业界有没有一个合适的方案?或者关于SQL大容量查询 的一些书籍。
*1:首先,我的服务器是小水管,50万条已经相当重了。其次,就算我现在扩展服务器配置,假设某天达到了1亿条,也会成为很大的负载压力。
表结构:
id openid nickname avatar
部分openid的nickname或avatar(头像)是空的,想要每次查出100个nickname或avatar(头像)为空的openid,并调用微信接口,将获取到的信息插入。
这个问题有点奇怪,到底是要返回100条数据呢?还是返回这100条数据里的最后一条ID呢?
首先50W条数据不算多,除非部署服务器的机器性能非常差,所以查询速度应该不至于很慢(除非你写了很复杂或者性能很低的SQL),分多次取出的话的确可以减轻数据库压力,但会增加网络传输压力。
另外,50W表数据的解决方案跟1E表数据的解决方案是完全不同的,所以不要妄想一套方案可以一劳永逸。
附上SQL:
SELECT DISTINCT openid FROM table
WHERE nickname IS NULL
OR avatar IS NULL
ORDER BY id DESC
LIMIT 100
由于用到了OR,所以估计用不上nickname和avatar的索引,或者你可以增加一个叫completed的字段,表示该条记录是否已经完善(即nickname和avatar均不为空,在程序插入数据时就维护该字段),这样你的查询SQL就可以避免OR连接了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。