第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有什么效果/更好的一次查詢 OFFSET/LIMIT 多次與單個查詢?nèi)缓笾鹦凶x取

有什么效果/更好的一次查詢 OFFSET/LIMIT 多次與單個查詢?nèi)缓笾鹦凶x取

Go
蝴蝶刀刀 2022-07-11 15:38:20
哪一個更好(在大多數(shù)因素中,例如內(nèi)存使用情況、可伸縮性,在這兩種情況下:總數(shù)據(jù)少于 RAM 或數(shù)據(jù)庫中的總數(shù)據(jù)多于 RAM):每 1k 查詢多次,直到?jīng)]有更多行SELECT *FROM foo  LEFT JOIN ... ON ... -- multiple timesORDER BY createdLIMIT ?*1000, 1000 然后n := 0for {   rows, err := db.Query(sql, n) // assume this is prepared statement   if err != nil { return nil, err }   defer rows.Close()   subtotal := 0   for rows.Next() {      err = rows.Scan( ... )      if err != nil { return nil, err }      subtotal += 1   }   if subtotal == 0 { break }   n += 1}對比一次查詢?nèi)缓髵呙杷黃ELECT *FROM foo  LEFT JOIN ... ON ... -- multiple timesORDER BY created然后rows, err := db.Query(sql) // assume this is prepared statementif err != nil { return nil, err }defer rows.Close()for rows.Next() {   err = rows.Scan( ... )   if err != nil { return nil, err }}
查看完整描述

2 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊

請記住,確實(shí)的查詢LIMIT 500000, 1000必須掃描 501,000 行才能獲得最后 1000 行。LIMIT 按位置而不是按值選擇行。所以沒有辦法使用索引直接跳到你想要的行。因此,它必須從第一行開始,讀取所有行,直到超過您要求的偏移量。

因此,重復(fù)地對具有連續(xù)偏移量的行集進(jìn)行分頁非常昂貴,因?yàn)槊總€下一個查詢都必須重新讀取它之前已經(jīng)讀取的數(shù)千行。它基本上是一個 O(n 2 ) 算法。

PS:這行不通:LIMIT ?*1000, 1000因?yàn)?LIMIT 不接受表達(dá)式。它只需要整數(shù)文字或占位符。在傳遞值之前,您必須LIMIT ?, 1000在 Go 代碼中進(jìn)行乘法運(yùn)算。


查看完整回答
反對 回復(fù) 2022-07-11
?
青春有我

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個贊

正如比爾在他的回答中提到的,OFFSET 查詢有充分的缺點(diǎn)。


就數(shù)據(jù)庫而言,使用單個查詢選擇所有內(nèi)容是快速的,但如果您不快速處理返回的行,它會長時間使用數(shù)據(jù)庫連接,使其無法用于其他任何人。這在繁忙的服務(wù)器中可能是一個問題,其中空閑的數(shù)據(jù)庫連接通常是稀缺資源。


您(可能)錯過了沒有這些缺點(diǎn)的第三個選項(xiàng):鍵集分頁(又名尋求分頁)。如果 foo 至少有一個 UNIQUE NOT NULL 列(即一個主鍵),并且 created 被索引,則此方法有效。


鍵集分頁在整個網(wǎng)絡(luò)上都有很好的解釋,但簡而言之(假設(shè) foo 有一個名為“id”的 UNIQUE NOT NULL 列):


SELECT *

FROM foo

  LEFT JOIN ... ON ... -- multiple times

WHERE (foo.created = X AND foo.id > Y) OR foo.created > X

ORDER BY foo.created, foo.id

LIMIT 1000

這里,X 和 Y 分別是上一個查詢中最后一行的 created 和 id 列的值(省略第一個查詢中的 WHERE 子句)。


這樣,您可以在恒定時間內(nèi)檢索連續(xù)的頁面。根據(jù)將行插入 foo 或任何連接表的方式,執(zhí)行此操作時可能會丟失行或獲得重復(fù)的行(與 OFFSET 相同)。如果這不是一個選項(xiàng),您必須堅(jiān)持一個查詢。


查看完整回答
反對 回復(fù) 2022-07-11
  • 2 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號