內容整理在GitHub,地址https://github.com/Muscleape/TestDemoProjects
MySQL分頁查詢
limit的用法mysql
- limit子句能夠被用於強制select語句返回指定的記錄數;
- 接受1個或2個整數常量作參數,第一個是返回記錄行的偏移量,第二個是返回記錄行的最大數目
-- 檢索記錄行6~15; mysql> SELECT * FROM table LIMIT 5,10; -- 從某個偏移量到記錄集的最後,能夠指定第二個參數爲-1; mysql> SELECT * FROM table LIMIT 95,-1; -- 若是隻給定一個參數,表示返回的做答記錄行數目; mysql> SELECT * FROM table LIMIT 5; -- LIMIT n 等價於 LIMIT 0,n;
MySQL分頁查詢語句的性能分析git
- 確保使用索引,下列語句中在ta_id和id兩列上創建索引
mysql> SELECT * FROM ta WHERE ta_id = 111 ORDER BY id LIMIT 50,10;
- 使用子查詢,隨着數據量增長,越日後LIMIT語句的偏移量就會越大,速度會明顯變慢;
-- 使用子查詢以前,偏移量爲10000; mysql> SELECT * FROM ta WHERE ta_id = 123 ORDER BY id LIMIT 10000, 10; -- 使用子查詢以後; mysql> SELECT * FROM ta WHERE id >= (SELECT id FROM ta WHERE ta_id = 111 ORDER BY id LIMIT 10000,1) LIMIT 10;
大數據量的MySQL表,LIMIT分頁存在嚴重的性能問題:github
優化方式:sql
- 使用子查詢
- 利用相似策略模式處理分頁,判斷100頁之內使用基本的分頁方式,100頁以上使用子查詢的分頁方式;
- 使用有索引的列或主鍵列進行order by操做
- 記錄上次返回的主鍵,下次查詢時使用主鍵過濾
- 爲了保證index索引列連續,能夠爲每一個表增長一個自增的字段,而且加上索引