信我一次邪,mysql的limit不要這樣用

2020-12-08 軟體開發領路人

我們做的大部分系統都會涉及到與資料庫數據的交互。在數據量比較大時,為了性能和交互的友好,就需要做分頁查詢了。

如果是mysql資料庫的話,做分頁查詢大家就離不開使用limit了。

比如我們要對表「coder」中的數據做分頁查詢,每頁20條數據。那程序生成的查詢第一頁的數據的sql會是下面這樣。

而查詢第二頁時,生成的查詢sql語句就是下面這樣。

以此類推。

如果數據量不是太大時,通過上面的limit的方式做分頁是沒有問題的。

但是今天要對大家說的就是,這樣的limit的方式在有的時候是有問題的。問題就是在數據量很大時,隨著越往後翻頁limit的兩個參數中的第一個參數也會越大,sql的執行耗時也會越來越大。

因為limit的兩個參數中的第一個是表示偏移量的,也就是要跳過多少條數據,這個過程隨著要跳過的數據量的增大,是非常耗費時間的。

那這種情況要怎麼處理呢?

這裡就可以用到主鍵索引了,可以像下面這樣寫sql語句。

查詢第一頁時,sql是下面這樣。

或者

而以後的每一頁查詢時,都需要依靠前一頁的最大(如果是降序的話,就是最小)id值。假設上一頁最大的id值是9527,那查詢下一頁的SQL語句就會是下面這樣。

通過這樣的方式,就能準確的命中索引,並從索引位置獲取指定條數數據,就搞笑很多了。

希望今天的內容能幫助到朋友們。

看完了本文,如果覺得寫得還行,或者心情還不錯,就小手抖一抖,長按「點讚」按鈕,支持我一下吧。

您的支持是我後續寫東西的動力。

相關焦點

  • MySQL 用 limit 為什麼會影響性能?
    其實我也想問這個問題。證實下面我們實際操作一下來證實上述的推論:為了證實select * from test where val=4 limit 300000,5是掃描300005個索引節點和300005個聚簇索引上的數據節點,我們需要知道MySQL有沒有辦法統計在一個sql中通過索引節點查詢數據節點的次數。我先試了Handler_read_*系列,很遺憾沒有一個變量能滿足條件。
  • MySQL 用 limit 會影響性能?
    像上面這樣,需要查詢300005次索引節點,查詢300005次聚簇索引的數據,最後再將結果過濾掉前300000條,取出最後5條。其實我也想問這個問題。我先試了Handler_read_*系列,很遺憾沒有一個變量能滿足條件。我只能通過間接的方式來證實:InnoDB中有buffer pool。裡面存有最近訪問過的數據頁,包括數據頁和索引頁。所以我們需要運行兩個sql,來比較buffer pool中的數據頁的數量。
  • MySQL大數據下Limit使用
  • MySQL的Limit 性能差?真的不能再用了?
    我們看一下select * from test where val=4 limit 300000,5;的查詢過程:根據葉子節點上的主鍵值去聚簇索引上查詢需要的全部欄位值。類似於下面這張圖:image像上面這樣,需要查詢300005次索引節點,查詢300005次聚簇索引的數據,最後再將結果過濾掉前300000條,取出最後5條。
  • mysql limit高級用法示例
    mysql limit效率: select `id`,`title
  • Mysql Limit 字句優化
    PRIMARY KEY(id),index(col1))ENGINE=InnoDBmysql root@localhost:test_db> select * from tbl6 limit 8000,10;# resultSet...
  • MySQL的Limit詳解
    對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。在SQL Server資料庫中語法為:SELECT TOP number|percent column_name(s) FROM table_name但是並非所有的資料庫系統都支持 TOP 子句,比如Oracle和MySQL,它們有等價的語法。
  • Mysql的limit用法與幾種分頁形式
    不用擔心,mysql已經為我們提供了這樣一個功能。 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset  LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。
  • MySQL的limit用法和分頁查詢的性能分析及優化
    不用擔心,mysql已經為我們提供了這樣一個功能。在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引:舉例來說,如果實際SQL類似下面語句,那麼在category_id, id兩列上建立複合索引比較好:SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10
  • 玩轉Mysql系列 - 第7篇:詳解排序和分頁(order by & limit),及存在的坑
    打算提升sql技能的,可以加我微信itsoku,帶你成為sql高手。這是Mysql系列第7篇。環境:mysql5.7.25,cmd命令中進行演示。代碼中被[]包含的表示可選,|符號分開的表示可選其一。排序語法:select 欄位名 from 表名 order by 欄位1 [asc|desc],欄位2 [asc|desc];需要排序的欄位跟在order by之後;asc|desc表示排序的規則,asc:升序,desc:降序,默認為asc;支持多個欄位進行排序,多欄位排序之間用逗號隔開
  • MySQL慢查詢參數min_examined_row_limit
    對於慢查詢日誌,比較重要的幾個參數如下:slow_query_log=1long_query_time=0.5slow_query_log_file=/mysql/data/mysql_slow.logslow_query_log表示是否開啟慢查詢long_query_time表示慢查詢閾值,SQL執行時間超過該值,則會記錄到慢查詢日誌中。
  • PHP mysql中limit用法詳解(代碼示例)
    php $link = mysqli_connect("localhost", "root", "", "Mydb");    if ($link == = false) {     die("ERROR: Could not connect. ".mysqli_connect_error()); }
  • MySQL分頁優化解析
    似乎討論分頁的人很少,難道大家都沉迷於limit m,n?在有索引的情況下,limit m,n速度足夠,可是在複雜條件搜索時,where somthing order by somefield+somefieldmysql會搜遍資料庫,找出「所有」符合條件的記錄,然後取出m,n條記錄。
  • 【219期】面試官:談談MySQL的limit用法、邏輯分頁和物理分頁
    物理分頁為什麼用limit在講解limit之間,我們先說說分頁的事情。分頁有邏輯分頁和物理分頁,就像刪除有邏輯刪除和物理刪除。邏輯刪除就是改變資料庫的狀態,物理刪除就是直接刪除資料庫的記錄,而邏輯刪除只是改變該資料庫的狀態。
  • Mysql 手工注入【常規union查詢篇】
    mysql> select concat_ws(' # ',username,passwd,email) from admin limit 0,1;mysql> select concat_ws(' # ',username,passwd,email,null) from admin limit 0,1;mysql> select concat_ws(null
  • SQL 查詢優化之 WHERE 和 LIMIT 使用索引的奧秘
    搞清楚原理之後,我們了解了為什麼第一條慢,第二條快的原因,但是問題又來了為什麼mysql不用idx_acct_id索引,這是一個問題,因為這樣的話,我們的建立的索引基本失效了,在此類sql下查詢效率將會是相當低。
  • 小心避坑:MySQL分頁時使用 limit+order by 會出現數據重複問題
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1、問題描述在MySQL中我們通常會採用limit來進行翻頁查詢,比如limit(0,10)表示列出第一頁的10條數據,limit(10,10)表示列出第二頁。
  • MySQL的四種GROUP BY用法
    原文出處:https://www.percona.com/blog/2018/02/05/four-ways-to-execute-mysql-group-by/原文作者:Peter Zaitsev 在本文中,我將介紹MySQL
  • 技術分享 | MySQL 執行 GROUP BY 的四種方式
    這樣,它可以在移動到另一個組之前計算單個組的聚合函數值。當然,問題在於,在大多數情況下,源數據值不會被分組。來自各種組的值在處理期間彼此跟隨。因此,我們需要一個特殊的步驟。1 | | 9 | 1 | +---+---+ 5 rows in set (0.00 sec) mysql> explain select k, count(*) c from tbl group by k order by k limit 5 \G ********************
  • 詳細的說說mysql的分頁查詢,請細品
    今天和大家聊聊mysql的分頁查詢,我想關於MySQL的分頁查詢,大家肯定都不陌生,為什麼要講呢?因為當初剛剛學習的時候,被這個分頁搞暈過,所以今天拿出來講講,也是重溫一下當年的感覺,好了,話不多說,直接開始吧!