首頁 資料庫 mysql教程 优化mysql的limit offset的例子

优化mysql的limit offset的例子

Jun 07, 2016 pm 05:55 PM
limit offset

在mysql中,通常使用limit做分页,而且经常会跟order by 连用。在order by 上加索引有时候是很有帮助的,不然系统会做很多的filesort

经常碰到的一个问题是limit的offset太高,如:limit 100000,20,这样系统会查询100020条,然后把前面的100000条都扔掉,这是开销很大的操作,导致查询很慢。假设所有分页的页面访问频率一样,这样的查询平均扫描表的一半数据。优化的方法,要么限制访问后面的页数,要么提升高偏移的查询效率。

一个简单的优化办法是使用覆盖查询(covering index)查询,然后再跟全行的做join操作。如:

代码如下:
SQL>select * from user_order_info limit 1000000,5;

这条语句就可以优化为:
代码如下:
select * from user_order_info inner join (select pin from user_order_info limit 1000000,5) as lim using(pin);
SQL>explain select * from user_order_info limit 1000000,5;
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
| 1 | SIMPLE | user_order_info | ALL | NULL | NULL | NULL | NULL | 23131886 | |
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
1 row in set (0.00 sec)
SQL>explain extended select * from user_order_info inner join (select pin from user_order_info limit 1000000,5) as lim using(pin);
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | |
| 1 | PRIMARY | user_order_info | eq_ref | PRIMARY | PRIMARY | 42 | lim.pin | 1 | 100.00 | |
| 2 | DERIVED | user_order_info | index | NULL | PRIMARY | 42 | NULL | 23131886 | 100.00 | Using index |
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
3 rows in set, 1 warning (0.66 sec)


根据两个explain的对比,可以清晰发现,第一个未使用索引,扫描了23131886行,第二个也扫描了同样的行数,但是使用了索引,效率提高了。这样可以直接使用index得到数据,而不去查询表,当找到需要的数据之后,在与全表join,获得其他的列。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Laravel中take和limit的使用方法詳解 Laravel中take和limit的使用方法詳解 Mar 10, 2024 pm 05:51 PM

《Laravel中take和limit的使用方法詳解》在Laravel中,take和limit是兩個常用的方法,用於在資料庫查詢中限制傳回的記錄數。雖然它們的作用類似,但在具體的使用場景中有一些細微的區別。本文將詳細解析這兩個方法的用法,並提供具體的程式碼範例。一、take方法在Laravel中,take方法用來限制傳回的記錄數,通常結合orderBy法一起

深入探討Laravel中take和limit的不同之處 深入探討Laravel中take和limit的不同之處 Mar 10, 2024 pm 01:00 PM

在Laravel中,我們常常用到一些方法來限制查詢結果的數量,其中包含take和limit兩個方法。雖然它們都可以用來限制查詢結果的數量,但它們之間確實有一些細微的差異。在本文中,我們將深入探討take和limit在Laravel的不同之處,並透過具體的程式碼範例來加以說明。首先,讓我們來看看take方法。 take方法是Eloquent的一部分,通常用於

Laravel中take和limit的功能及用法對比 Laravel中take和limit的功能及用法對比 Mar 09, 2024 pm 09:09 PM

Laravel中take和limit是兩種常用的方法,用來限制查詢結果集的數量。雖然它們在功能上有一定的相似之處,但在使用方式和一些細節上有所不同。本文將對這兩種方法的功能及用法進行詳細對比,同時提供具體的程式碼範例,幫助讀者更好地理解它們之間的差異和如何正確地應用。 1.take方法take方法是LaravelEloquent查詢建構器中

如何使用Java中的Stream的limit和skip函數進行流程操作 如何使用Java中的Stream的limit和skip函數進行流程操作 Jun 26, 2023 pm 03:55 PM

Java8中引入了StreamAPI,它能夠大幅簡化對集合的操作。 Stream類別提供了許多用於操作流程的函數式方法,包括過濾、映射、合併等等。其中,limit和skip是用於流操作中限制元素數量的兩個函數。一、limit函數limit函數用來限制流中元素的數量,它接受一個long類型的參數n,表示限制的數量。呼叫limit函數後,傳回一個新的流,它只包含

最後幻想7limit怎麼存 最後幻想7limit怎麼存 Mar 07, 2024 pm 06:40 PM

玩家在最終幻想7中進行遊戲時可以透過積攢limit使用極限技,可以造成巨大傷害或提供強大的支援效果,玩家可以透過受到傷害、攻擊敵人、被擊中連擊等方式獲得limit。最後幻想7limit怎麼存1、受傷當角色受到敵方攻擊或隊友受到攻擊時,limit條會逐漸成長。受到的傷害越多,limit條填得越快。 2.攻擊敵人主動攻擊敵人也能增加limit條的填充速度。使用普通攻擊、技能或魔法都能累積limit。 3.被擊中連擊角色連續被敵人攻擊時,limit條的填充速度會加快。可以透過吸引敵人的注意或使用持

不同的MySQL分頁實作方式 不同的MySQL分頁實作方式 Feb 19, 2024 pm 03:26 PM

MySQL分頁方法有哪些,需要具體程式碼範例MySQL是一種關係型資料庫管理系統,為了提高查詢效率和減少資料傳輸量,分頁查詢是一個非常常見的需求。 MySQL提供了多種分頁方法,以下將詳細介紹這些方法,並提供具體的程式碼範例。使用LIMIT子句分頁:LIMIT子句用來限制查詢結果的傳回行數。它有兩個參數,第一個參數指定傳回結果的起始偏移位置(從0開始計數),第二個

PHP Notice: Undefined offset解決方法 PHP Notice: Undefined offset解決方法 Jun 25, 2023 am 09:51 AM

PHPNotice:Undefinedoffset是一種常見的PHP程式錯誤,它表示程式嘗試使用陣列中不存在的下標,導致程式無法正常運作。這種錯誤通常會在PHP解釋器顯示以下警告訊息時發生:Notice:Undefinedoffset。以下是一些解決PHPNotice:Undefinedoffset錯誤的方法:檢查程式碼首先,應該

PHP Notice: Undefined offset: 4的解決方法 PHP Notice: Undefined offset: 4的解決方法 Jun 22, 2023 pm 04:51 PM

PHPNotice:Undefinedoffset:4的解決方法在使用PHP編寫程式碼的過程中,我們可能會遇到類似「PHPNotice:Undefinedoffset:4」的錯誤提示。這個錯誤提示意味著我們在存取一個陣列時,嘗試存取一個不存在的元素。具體來說,如果我們有一個陣列$my_array,其中只有3個元素,而我們嘗試存取$my_arra

See all articles