前言
爲提高查詢效率,現提出以下優化思路,但是這種思路做排序算法(置頂、置底、手動錄入排序號)影響效率,慎重使用,僅供參考。
庫中添加page、index字段用以分割數據組,以便抽取執行ddl語句的公式,模擬:初始page爲1 index爲1,以600爲一組,index值爲600時,page加1 index從1開始計算
1.查詢
參數定義:
p頁面傳遞的頁數
s頁面傳遞的條數
1.1 獲取當前page下起始條數
select (p * s - FLOOR(p * s /600 )* 600)
1.2. 獲取當前page
select FLOOR(p*s/600) + 1
例: 其中x爲通過 1.1 中 獲取的起始條數
查詢 第1頁 每頁20條
select * from employee_test where page = FLOOR(1*20/600) + 1 limit x,20 order by index_num
查詢 第31頁 每頁20條
select * from employee_test where page = FLOOR(31*20/600) + 1 limit x,20 order by index_num
1.3 性能
查詢第500頁,每頁20條
12000條數據時
-- 執行結果0.015 0.020 0.020 0.017 0.016 0.022 0.016 0.029 0.024 0.018
10次平均 0.01973
select * from employee_test where page = 17 limit 400,20
--執行結果0.023 0.019 0.016 0.019 0.022 0.023 0.018 0.017 0.020 0.015
10次平均 0.0192
select * from employee_test limit 10000,20
24000條數據時
-- 執行結果0.019 0.016 0.016 0.017 0.020 0.023 0.021 0.024 0.025 0.018
10次平均 0.0199
select * from employee_test where page = 17 limit 400,20
--執行結果0.018 0.018 0.017 0.025 0.018 0.023 0.024 0.020 0.019 0.024
10次平均 0.0206
select * from employee_test limit 10000,20
可見 在數據量較少時,添加page和index字段的性能與正常全表分頁性能相比,執行效果略高,但是不明顯,當數據達到一定量級,執行效率開始體現。繼續測試
在對page和index建立聯合索引後,10次執行效果
0.004 0.006 0.005 0.006 0.005 0.005 0.004 0.004 0.004 0.006
10次平均 0.0049在加上page和index聯合索引,數據24000條,條件不變,執行效率有很大提高
需要注意的事這種思路,只適用於刪除較少的業務,如果中間某條數據操作被刪除,page和index維護起來會增加一定的工作量。慎重使用
2.排序
原算法做數據上移下移排序,沒有問題但是如果涉及到置頂、置底操作可能涉及到全表更新,所以如果需要排序,可另外加一個排序字段,進行排序號的操作。