久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么提高M(jìn)ySQL Limit查詢(xún)性能的方法

共計(jì) 2226 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。

自動(dòng)寫(xiě)代碼機(jī)器人,免費(fèi)開(kāi)通

這篇文章給大家分享的是有關(guān)怎么提高 MySQL Limit 查詢(xún)性能的方法的內(nèi)容。丸趣 TV 小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨丸趣 TV 小編過(guò)來(lái)看看吧。

在 MySQL 數(shù)據(jù)庫(kù)操作中,我們?cè)谧鲆恍┎樵?xún)的時(shí)候總希望能避免數(shù)據(jù)庫(kù)引擎做全表掃描,因?yàn)槿頀呙钑r(shí)間長(zhǎng),而且其中大部分掃描對(duì)客戶(hù)端而言是沒(méi)有意義的。其實(shí)我們可以使用 Limit 關(guān)鍵字來(lái)避免全表掃描的情況,從而提高效率。

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

select * from mytable where index_col = xxx limit offset, limit;

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

問(wèn)題:頭幾萬(wàn)條讀取很快,但是速度呈線(xiàn)性下降,同時(shí) mysql server cpu 99%,速度不可接受。

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

在 MySQL optimization 的文檔寫(xiě)到 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.

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

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

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

Limit 語(yǔ)法:

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

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

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

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

mysql  SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6 -15
// 為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1
mysql  SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last
// 如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目,換句話(huà)說(shuō),LIMIT n  等價(jià)于  LIMIT 0,n
mysql  SELECT * FROM table LIMIT 5; // 檢索前 5 個(gè)記錄行 

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

select * from table limit 10000,10
select * from table limit 0,10

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

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

1、offset 比較小的時(shí)候:

select * from table limit 10,10 
// 多次運(yùn)行,時(shí)間保持在 0.0004-0.0005 之間
Select * From table Where vid >=(Select vid From table Order By vid limit 10,1) limit 10 
// 多次運(yùn)行,時(shí)間保持在 0.0005-0.0006 之間,主要是 0.0006

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

2、offset 大的時(shí)候:

select * from table limit 10000,10 
// 多次運(yùn)行,時(shí)間保持在 0.0187 左右
Select * From table Where vid >=(Select vid From table Order By vid limit 10000,1) limit 10
// 多次運(yùn)行,時(shí)間保持在 0.0061 左右,只有前者的 1 /3。可以預(yù)計(jì) offset 越大,后者越優(yōu)。

感謝各位的閱讀!關(guān)于“怎么提高 MySQL Limit 查詢(xún)性能的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向 AI 問(wèn)一下細(xì)節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計(jì)2226字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 十堰市| 措勤县| 南充市| 晋州市| 瑞昌市| 宁陕县| 锡林郭勒盟| 贡山| 桐庐县| 虹口区| 皮山县| 金塔县| 营山县| 东乡| 安岳县| 屏山县| 乌兰察布市| 城固县| 辽阳县| 肥城市| 吉木乃县| 东至县| 开江县| 古蔺县| 临沧市| 靖远县| 来凤县| 巫溪县| 延川县| 新和县| 祁阳县| 桃江县| 西峡县| 延津县| 莆田市| 兴城市| 民权县| 辽中县| 长顺县| 永平县| 温州市|