最近在工作中,我們遇到了一個需求,甲方要求直接從數(shù)據(jù)庫導(dǎo)出一個業(yè)務(wù)模塊中所有使用中的工單信息。為了實現(xiàn)這一目標(biāo),我編寫了一條SQL查詢語句,并請求DBA協(xié)助導(dǎo)出數(shù)據(jù)。盡管工單數(shù)量并不多,只有3000多條,但每個工單都包含了大量的信息。DBA進(jìn)行了多次導(dǎo)出操作,不幸的是,每次嘗試導(dǎo)出都導(dǎo)致了操作平臺的卡頓和無響應(yīng)。
為了克服這一問題,我們決定采用MySQL的分頁技術(shù),具體使用了LIMIT和OFFSET關(guān)鍵詞,將導(dǎo)出操作拆分成多個批次進(jìn)行。通常,我們在項目中使用一些開源插件如pagehelper等來實現(xiàn)頁面分頁,很少自己在sql中編寫分頁邏輯。但在這次需求中,我們不得不深入了解并使用了MySQL的分頁功能。
在本文中,我們將詳細(xì)探討MySQL中的LIMIT
和OFFSET
關(guān)鍵詞,以及如何通過性能優(yōu)化來處理分頁查詢,以滿足業(yè)務(wù)需求。
什么是分頁查詢?
分頁查詢是一種將大型數(shù)據(jù)集拆分成可管理塊的技術(shù),以便在用戶界面中逐頁顯示。這在Web應(yīng)用、移動應(yīng)用和報告生成中非常常見,它有助于提高性能并改善用戶體驗,因為不需要一次加載全部數(shù)據(jù)。
分頁關(guān)鍵字
LIMIT
關(guān)鍵字
LIMIT
關(guān)鍵字用于限制返回結(jié)果集中的行數(shù)。其基本語法如下:
SELECT * FROM 表名 LIMIT 行數(shù);
例如,要從名為mark_info的表中選擇最新創(chuàng)建的10個工單的信息,可以執(zhí)行以下查詢:
SELECT * FROM mark_info ORDER BY CREATE_TIME DESC LIMIT 10;
OFFSET
關(guān)鍵字
OFFSET
關(guān)鍵字用于指定從結(jié)果集的哪一行開始返回數(shù)據(jù)。通常,它與LIMIT
一起使用,以實現(xiàn)分頁效果。其語法如下:
SELECT * FROM 表名 LIMIT 行數(shù) OFFSET 偏移量;
或者
SELECT * FROM 表名 LIMIT 行數(shù) , 偏移量;
這兩寫法效果是一樣的。
例如,要從mark_info表中選擇選擇最新創(chuàng)建的第11到第20個工單的信息,可以執(zhí)行以下查
SELECT * FROM mark_info ORDER BY CREATE_TIME DESC LIMIT 10 OFFSET 10;
或者
SELECT * FROM mark_info ORDER BY CREATE_TIME DESC LIMIT 10 , 10;
分頁查詢的示例
假設(shè)我們有一個名為bus_work_order_operate_info
的表,其中存儲了大量工單操作記錄。我們希望實現(xiàn)一個分頁功能,每頁顯示10個工單操作的信息。以下是如何執(zhí)行分頁查詢的示例:
-- 第一頁,顯示最新的10個工單操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10;
-- 第二頁,顯示接下來的10個工單操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 10;
-- 第三頁,顯示接下來的10個工單操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 20;
-- 以此類推...
性能優(yōu)化
我們在很多的實際應(yīng)用場景中,一般 limit 加上偏移量,加上order by
子句,配合合適的索引,效率通常不錯。但是當(dāng)偏移量非常大的時候,需要跳過大量的數(shù)據(jù),這樣會有很大的性能問題。以下是一個優(yōu)化的示例:
未優(yōu)化sql
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 5000;
查詢分析
優(yōu)化后sql
select T1.* from bus_work_order_operate_info T1 INNER JOIN (select ID FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 5000 ) T2 ON T1.ID = T2.ID;
查詢分析
通過查詢分析對比,優(yōu)化后的sql掃描的數(shù)據(jù)行數(shù)更少,查詢可能會更加高效,所以我們可以考慮用這種方式對大偏移量的limit
進(jìn)行優(yōu)化。文章來源:http://www.zghlxwxcb.cn/news/detail-691265.html
總結(jié)
MySQL的分頁查詢是處理大量數(shù)據(jù)集的常見需求,了解LIMIT
和OFFSET
關(guān)鍵字的用法可以幫助您有效地實現(xiàn)分頁功能。同時,性能優(yōu)化也是確保查詢高效執(zhí)行的關(guān)鍵。通過合理配置和結(jié)合其他優(yōu)化策略,您可以輕松應(yīng)對分頁查詢的挑戰(zhàn),提供更好的用戶體驗。文章來源地址http://www.zghlxwxcb.cn/news/detail-691265.html
到了這里,關(guān)于MySQL分頁查詢詳解:優(yōu)化大數(shù)據(jù)集的LIMIT和OFFSET的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!