>  Q&A  >  본문

mysql - SQL语句可以提供“查询表,并至第100条结果为止”吗?

描述问题
  目前想用SQL语句来查询一个表(50万条),并将表内昵称为空的用户Openid拿出来,每百条查询一次。环境MySQL。

问题关键
  一次性取出,分百条查询,也会给服务器造成很大压力(*1),能不能让SQL查询出100条符合结果的记录,并返回最后一条的ID?

拓展
  除了我这种想法,业界有没有一个合适的方案?或者关于SQL大容量查询 的一些书籍。

*1:首先,我的服务器是小水管,50万条已经相当重了。其次,就算我现在扩展服务器配置,假设某天达到了1亿条,也会成为很大的负载压力。

表结构:
id openid nickname avatar

部分openid的nickname或avatar(头像)是空的,想要每次查出100个nickname或avatar(头像)为空的openid,并调用微信接口,将获取到的信息插入。

PHP中文网PHP中文网2742일 전637

모든 응답(6)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 15:02:45

    能不能让SQL查询出100条符合结果的记录,并返回最后一条的ID?

    这个问题有点奇怪,到底是要返回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,所以估计用不上nicknameavatar的索引,或者你可以增加一个叫completed的字段,表示该条记录是否已经完善(即nicknameavatar均不为空,在程序插入数据时就维护该字段),这样你的查询SQL就可以避免OR连接了。

    회신하다
    0
  • PHPz

    PHPz2017-04-17 15:02:45

    把需要查询的字段都建上索引,在你现在这个场景下千万级数据都不会有压力

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:02:45

    1.索引加了没有?
    2.SQL优化一下

    50万数据真心不算多啊。

    회신하다
    0
  • PHPz

    PHPz2017-04-17 15:02:45

    搞不懂你要实现什么功能,查出100条却只返回最后一条的一个列,没意义,区区50w数据而已,非要实现加索引写存储过程也就差不多了480w行的表查符合条件的列并返回所有整行,10秒而已,你的问题可能出在符合条件的行太多输出时内存不够,你可以写游标把结果一条一条插入一张新表,时间慢点而已。

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 15:02:45

    加索引,或者把数据库定时写入缓存

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 15:02:45

    你这样很没意思,搞得我声望成负的了,结果不理想可以讨论,直接删算什么

    회신하다
    0
  • 취소회신하다