mysql分頁時offset過大的Sql最佳化經驗分享
發現問題
當我們展示一個列表中的內容時,難免會遇到分頁問題,因為列表中的內容數量可能很多,但是使用者能一次看到的介面大小是有限的,不可能一個介面展示所有的內容,從後端一次性取太多的資料也會給後端造成額外的壓力。
通常分頁查詢的時候會使用這樣的語句:
?
SELECT * FROM table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000
|
當offset特別大時,這條語句的執行效率會明顯減低,而且效率是隨著offset的增大而降低的。
原因為:
MySQL並不是跳過offset行,而是取offset+N行,然後返回放棄前offset行,返回N行,當offset特別大,然後單條資料也很大的時候,每次查詢需要獲取的資料就越多,自然就會很慢。
最佳化方案:
?
SELECT * FROM table JOIN ( select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) as tmp using(id)
|
或者
?
SELECT a.* FROM table a, ( select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) b where a.id = b.id
|
先獲取主鍵列表,再透過主鍵查詢目標資料,即使offset很大,也是獲取了很多的主鍵,而不是所有的欄位資料,相對而言效率會提升很多。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對指令碼之家的支援。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2805033/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL分頁查詢offset過大,Sql最佳化經驗MySql
- mysql分頁-limit offset分頁MySqlMIT
- PHP+ MYSQL的配置過程經驗分享PHPMySql
- 最佳化mysql的limit offset的例子MySqlMIT
- MySQL最佳化經驗MySql
- SQL Server 儲存過程的經典分頁(轉)SQLServer儲存過程
- mysql建表常用sql語句個人經驗分享MySql
- 一份經過時間檢驗的 Laravel PHPUnit 測試經驗分享LaravelPHP
- Mysql 分頁效率不同的SQLMySql
- 6條經過驗證的創業經驗分享創業
- MYSQL效能最佳化分享(分庫分表)MySql
- 分享5款經過時間驗證的精品軟體
- 1月14日滿分透過CCNA(經驗分享)(轉)
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- SQL 分頁儲存過程SQL儲存過程
- sql儲存過程分頁SQL儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- SQL最佳化案例-單表分頁語句的最佳化(八)SQL
- MySQL從庫維護經驗分享MySql
- 華為 OD 過了,經驗貼分享
- 過來人的自學python經驗分享Python
- MySQL效能最佳化的最佳20+條經驗MySql
- Android大廠面試經驗分享Android面試
- Unite’17 開發者大會經驗分享
- MySQL 分表最佳化試驗程式碼MySql
- 【Mysql】針對跑mysql的linux機器的最佳化經驗MySqlLinux
- 得物面試:MySQL 深度分頁如何最佳化?面試MySql
- 在大資料情況下MySQL的一種簡單分頁最佳化方法大資料MySql
- 經驗分享 ----------
- 經驗分享
- 高手詳解SQL效能最佳化十條經驗SQL
- 張翼:Spark SQL在攜程的實踐經驗分享!SparkSQL
- MySQL、Oracle和SQL Server的分頁查詢語句MySqlOracleServer
- Laplace分佈運算元開發經驗分享
- oracle大表新增欄位default經驗分享Oracle
- SQL最佳化 | MySQL問題處理案例分享三則MySql
- sql最佳化(mysql)MySql