优化mysql的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 |
| 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,获得其他的列。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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