mysql中token的分頁(yè)升級(jí)
數(shù)據(jù)庫(kù)分頁(yè)查詢(xún)時(shí),必須返回一個(gè)用于分頁(yè)的token,這個(gè)token可以直接用于定位下一頁(yè)的第一條數(shù)據(jù)。不能簡(jiǎn)單的使用limit offset的偏移量作為page token,在數(shù)據(jù)量大時(shí)無(wú)法降低查詢(xún)時(shí)間復(fù)雜度。
簡(jiǎn)介
這個(gè)觀(guān)點(diǎn)的核心在于提高大數(shù)據(jù)集分頁(yè)查詢(xún)的效率。當(dāng)數(shù)據(jù)量非常大時(shí),使用 LIMIT
和 OFFSET
語(yǔ)句分頁(yè)可能會(huì)導(dǎo)致性能問(wèn)題,因?yàn)閿?shù)據(jù)庫(kù)需要跳過(guò) OFFSET
指定數(shù)量的行來(lái)檢索數(shù)據(jù),這就意味著隨著 OFFSET
的增加,查詢(xún)效率會(huì)逐漸降低。
為了解決這個(gè)問(wèn)題,可以使用基于游標(biāo)(Cursor)或者稱(chēng)為 "Seek Method" 的分頁(yè)方法。這種方法不是通過(guò)指定要跳過(guò)的記錄數(shù)量來(lái)檢索下一頁(yè),而是通過(guò)記錄上一頁(yè)最后一條記錄的某個(gè)唯一鍵(通常是主鍵或者唯一索引),然后查詢(xún)所有排序后的下一組記錄。
這里是一個(gè)簡(jiǎn)單的示例,假設(shè)我們有一個(gè) users
表,其中包含一個(gè)自增的 id
字段作為主鍵。
首先,我們需要一個(gè) API,它不是接受一個(gè)頁(yè)碼,而是接受一個(gè) last_seen_id
(上一頁(yè)最后一個(gè)用戶(hù)的 ID)作為參數(shù)來(lái)獲取下一頁(yè)的數(shù)據(jù)。
代碼
下面是一個(gè)示例代碼,它使用 Flask 框架創(chuàng)建一個(gè)分頁(yè) API。為了簡(jiǎn)單起見(jiàn),這個(gè)例子不包括數(shù)據(jù)庫(kù)連接的細(xì)節(jié):
from flask import Flask, request, jsonify app = Flask(__name__) # 假設(shè)我們有一個(gè)數(shù)據(jù)庫(kù)查詢(xún)函數(shù) def query_db(query, args=(), one=False): # 這里應(yīng)該是執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)的代碼,比如使用 pymysql 或者 sqlalchemy # 這里只是為了示例,不提供具體實(shí)現(xiàn) pass # 分頁(yè)查詢(xún)的API @app.route('/users', methods=['GET']) def get_users(): # 設(shè)置默認(rèn)每頁(yè)數(shù)量和最大數(shù)量 default_page_size = 10 max_page_size = 100 # 從請(qǐng)求中獲取 last_seen_id 和每頁(yè)數(shù)量參數(shù) last_seen_id = request.args.get('last_seen_id', None) page_size = int(request.args.get('page_size', default_page_size)) # 限制page_size不能超過(guò)最大限制 if page_size > max_page_size: page_size = max_page_size # 創(chuàng)建查詢(xún),使用 last_seen_id 定位下一頁(yè)數(shù)據(jù) if last_seen_id: query = "SELECT * FROM users WHERE id > %s ORDER BY id ASC LIMIT %s" args = (last_seen_id, page_size) else: # 如果沒(méi)有提供 last_seen_id,就返回第一頁(yè)數(shù)據(jù) query = "SELECT * FROM users ORDER BY id ASC LIMIT %s" args = (page_size,) # 執(zhí)行查詢(xún) users = query_db(query, args) # 將查詢(xún)結(jié)果轉(zhuǎn)換為字典列表 # 假設(shè)每個(gè) user 是一個(gè)元組(id, name) users_list = [{'id': user[0], 'name': user[1]} for user in users] last_seen_id = users[-1][0] if users else None # 返回JSON響應(yīng) return jsonify({ 'users': users_list, 'last_seen_id': last_seen_id }) # 啟動(dòng)Flask應(yīng)用 if __name__ == '__main__': app.run(debug=True)
使用這個(gè) API,客戶(hù)端可以通過(guò)指定 last_seen_id
參數(shù)來(lái)獲取下一頁(yè)的數(shù)據(jù),例如 /users?last_seen_id=100&page_size=20
將獲取 ID 大于 100 的下一頁(yè) 20 條用戶(hù)記錄。
這種方法的優(yōu)點(diǎn)是,無(wú)論你要獲取的是第一頁(yè)還是第一百萬(wàn)頁(yè),查詢(xún)的效率都是一樣的,因?yàn)閿?shù)據(jù)庫(kù)總是從上一頁(yè)的最后一個(gè) id
開(kāi)始查找下一組記錄,而不需要跳過(guò)任何行。這樣可以大大提高查詢(xún)的效率,尤其是在處理大型數(shù)據(jù)集時(shí)。
到此這篇關(guān)于mysql中token的作用的文章就介紹到這了,更多相關(guān)mysql token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL慢查詢(xún)優(yōu)化之慢查詢(xún)?nèi)罩痉治龅膶?shí)例教程
這篇文章主要介紹了MySQL慢查詢(xún)?nèi)罩痉治龅膶?shí)例教程,通過(guò)設(shè)置參數(shù)從慢查詢(xún)?nèi)罩鹃_(kāi)始分析性能問(wèn)題的原因,需要的朋友可以參考下2015-11-11

淺談MySQL中授權(quán)(grant)和撤銷(xiāo)授權(quán)(revoke)用法詳解

Windows10系統(tǒng)下MySQL(8.0.37)安裝與配置教程

MySQL用limit方式實(shí)現(xiàn)分頁(yè)的實(shí)例方法

mysql通過(guò)binlog定時(shí)備份數(shù)據(jù)庫(kù)與恢復(fù)的方法

數(shù)據(jù)庫(kù)索引知識(shí)點(diǎn)整理

mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法小結(jié)