MYSQL limit優化方案

2021-10-06 09:17:38 字數 1735 閱讀 5905

limit 100,10 

掃瞄符合條件的110條資料只要後10條記錄,當偏移量100數值還不是很大的時候並不會產生效能問題。

limit 1000000,10的

但是當偏移量越大就會查詢的速度越慢。因為需要掃瞄的資料也會越來越多,這樣會直接導致磁碟io飆公升速度急劇下降。

方案一:

select  xx,xx,xx from table_name where (id >= 10000) limit 10
記錄每次取出的最大id, 然後where id >= 最大id

但是這種方案侷限性很大只應用於特定條件下,沒有任何的附加查詢條件,如果我需要一些額外的查詢條件,比如我只要某個使用者的資料 ,這種方法就行不通了。其次必須要有自增索引列,而且資料在邏輯上必須是連續的,同時你還必須知道特徵值。如此苛刻的要求,在實際應用中是不可能滿足的。

方案二:

子查詢優化法 ,先找出第一條資料,然後大於等於這條資料的id就是要獲取的資料

缺點:資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性

select ixx,xx,xx from table_name where id

>=

(select id from table_name order by id limit 1000000,10) limit 10;

如果limit的offset值過大,使用者也會翻頁疲勞,你可以設定乙個offset最大的,超過了可以另行處理,一般連續翻頁過大,使用者體驗很差,則應該提供更優的使用者體驗給使用者。

方案三:

select * from table_name where id

in(select id from table_name where (

id> 1000 )) limit 1000000, 10;

select xx,xx,xx from table_name where id

in(select id from table_name where ( ?條件)) limit 1000000, 10;

先查詢出需要資料的索引列(假設為 id),再通過索引列查詢出需要的資料。(不是直接使用limit,而是首先獲取到offset的id然後直接使用limit size來獲取資料)

原理:

方案四:

select xx,xx,xx from table_name inner join

(select

id from table_name where (?條件) limit 1000000,10)

b using (id)

# using等價於join操作中的on,例如a和b根據id欄位關聯,那麼以下等價using(id)

在資料量大的時候 in 操作的效率就不怎麼樣了,我們需要把 in 操作替換掉,使用 join 就是乙個不錯的選擇。

如果對於有where 條件,又想走索引用limit的,必須設計乙個索引,將where 放第一位,limit用到的主鍵放第2位,而且只能select 主鍵!

建立索引:alter table table_name add index idx_pid_id(where條件, 主鍵id)
方案五:

Mysql limit 優化優化

mysql 效能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現在充滿信心!mysql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統怎麼寫都可以,用xx框架可以實現快速開發。可是資料量到了10萬,百萬至千萬,他的效能還能那...

MySQL limit查詢優化

mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料 select from yanxue8 visit limit 10000,10 和 select from yan...

Mysql limit分頁優化

例如 優化後的子查詢語句還是需要獲取offset rows條資料,然後扔掉前offset條資料,但是只查詢了id乙個字段,對於資料量大的表來說,優化很多,而且,在優化後的語句裡可以使用byname的覆蓋索引 但個人認為更快的情況下 還是要在程式裡先計算出id的值 利用 select from tab...