搜尋

首頁  >  問答  >  主體

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中文网2787 天前677

全部回覆(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
  • 取消回覆