日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oschina mysql limit_如何提高MySQL Limit查询的性能

發(fā)布時間:2025/3/12 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oschina mysql limit_如何提高MySQL Limit查询的性能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在MySQL數(shù)據(jù)庫操作中,我們在做一些查詢的時候總希望能避免數(shù)據(jù)庫引擎做全表掃描,因為全表掃描時間長,而且其中大部分掃描對客戶端而言是沒有意義的。其實我們可以使用Limit關(guān)鍵字來避免全表掃描的情況,從而提高效率。

有個幾千萬條記錄的表 on MySQL 5.0.x,現(xiàn)在要讀出其中幾十萬萬條左右的記錄。常用方法,依次循環(huán):

1

select?*from?mytablewhere?index_col = xxx limit offset, limit;

經(jīng)驗:如果沒有blob/text字段,單行記錄比較小,可以把 limit 設(shè)大點,會加快速度。

問題:頭幾萬條讀取很快,但是速度呈線性下降,同時 mysql server cpu 99% ,速度不可接受。

調(diào)用 explain select * from mytable where index_col = xxx limit offset, limit;

顯示 type = ALL

在 MySQL optimization 的文檔寫到"All"的解釋

A full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables.

看樣子對于 all, mysql 就使用比較笨的方法,那就改用 range 方式??因為 id 是遞增的,也很好修改 sql 。

select * from mytable where id > offset and id < offset + limit and index_col = xxx

explain 顯示 type = range,結(jié)果速度非常理想,返回結(jié)果快了幾十倍。

Limit語法:

1

SELECT?*FROM?table?LIMIT [offset,]rows?|rows?OFFSET offset

LIMIT子句可以被用于強制 SELECT 語句返回指定的記錄數(shù)。LIMIT接受一個或兩個數(shù)字參數(shù)。參數(shù)必須是一個整數(shù)常量。

如果給定兩個參數(shù),第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1)。

為了與 PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。

1

mysql>SELECT?*FROM?table?LIMIT 5,10; //檢索記錄行6-15

2

3

//為了檢索從某一個偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個參數(shù)為-1

4

mysql>SELECT?*FROM?table?LIMIT 95,-1; //檢索記錄行96-last

5

6

//如果只給定一個參數(shù),它表示返回最大的記錄行數(shù)目,換句話說,LIMIT n 等價于 LIMIT 0,n

7

mysql>SELECT?*FROM?table?LIMIT 5; //檢索前5個記錄行

MySQL的limit給分頁帶來了極大的方便,但數(shù)據(jù)量一大的時候,limit的性能就急劇下降。同樣是取10條數(shù)據(jù),下面兩句就不是一個數(shù)量級別的。

1

select?*from?table?limit 10000,10

2

select?*from?table?limit 0,10

文中不是直接使用limit,而是首先獲取到offset的id然后直接使用limit size來獲取數(shù)據(jù)。根據(jù)他的數(shù)據(jù),明顯要好于直接使用limit。

這里我具體使用數(shù)據(jù)分兩種情況進行測試。

1、offset比較小的時候:

1

select?*from?table?limit 10,10

2

//多次運行,時間保持在0.0004-0.0005之間

3

Select?*From?table?Where?vid >=(Select?vidFrom?table?Order?By?vid limit 10,1) limit 10

4

//多次運行,時間保持在0.0005-0.0006之間,主要是0.0006

結(jié)論:偏移offset較小的時候,直接使用limit較優(yōu)。這個顯然是子查詢的原因。

2、offset大的時候:

1

select?*from?table?limit 10000,10

2

//多次運行,時間保持在0.0187左右

3

4

Select?*From?table?Where?vid >=(Select?vidFrom?table?Order?By?vid limit 10000,1) limit 10

5

//多次運行,時間保持在0.0061左右,只有前者的1/3。可以預(yù)計offset越大,后者越優(yōu)。

總結(jié)

以上是生活随笔為你收集整理的oschina mysql limit_如何提高MySQL Limit查询的性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。