濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL 分頁(yè)查詢的優(yōu)化技巧

MySQL 分頁(yè)查詢的優(yōu)化技巧

熱門(mén)標(biāo)簽:大豐地圖標(biāo)注app 南太平洋地圖標(biāo)注 400電話辦理服務(wù)價(jià)格最實(shí)惠 400電話變更申請(qǐng) 催天下外呼系統(tǒng) html地圖標(biāo)注并導(dǎo)航 呂梁外呼系統(tǒng) 北京金倫外呼系統(tǒng) 武漢電銷機(jī)器人電話

在有分頁(yè)查詢的應(yīng)用中,包括 LIMIT 和 OFFSET 的查詢十分常見(jiàn),而且?guī)缀趺總€(gè)都會(huì)有一個(gè) ORDER BY 子句。如果使用索引排序的話將對(duì)性能優(yōu)化十分有幫助,否則服務(wù)端需要做很多文件排序。

一個(gè)高頻的問(wèn)題是 offset 的值過(guò)大。如果查詢類似 LIMIT 10000, 20,將會(huì)產(chǎn)生10020行,并將之前的10000行丟棄,這樣的代價(jià)很高。假設(shè)所有的頁(yè)使用相同的頻次訪問(wèn),這樣的查詢將平均掃描一半數(shù)據(jù)表。為了優(yōu)化他們,你可以在分頁(yè)視圖中限制最多可訪問(wèn)的頁(yè)數(shù),或者讓大便宜的查詢更有效。

一個(gè)改善性能簡(jiǎn)單的技巧是在覆蓋索引上進(jìn)行查詢操作而不是整行數(shù)據(jù)。你可以將結(jié)果與完整的行做一次聯(lián)合然后再獲取額外需要的列。這樣的效率會(huì)更高,例如下面的查詢:

SELECT film_id, description FROM sakila.film ORDER BY title LIMIT 50, 5;

如果數(shù)據(jù)表很大的話,則可以按下面的方式進(jìn)行優(yōu)化:

SELECT film.film_id, film.description
FROM sakila.film
	INNER JOIN (
    SELECT film_id FROM sakila.film
    ORDER BY title LIMIT 50, 5)
  ) as lim USING(film_id);

這種“推斷聯(lián)合查詢”能夠有效工作是因?yàn)樗褂昧怂饕郎p少了服務(wù)端盡可能少地訪問(wèn)數(shù)據(jù)行去檢查數(shù)據(jù)。一旦復(fù)核要求的行查到了,將他們與對(duì)應(yīng)的數(shù)據(jù)表的行進(jìn)行聯(lián)合查詢以獲取對(duì)應(yīng)行的其他列。

有些時(shí)候也可以將 limit 轉(zhuǎn)換為固定位置的查詢,這種方式可以對(duì)索引進(jìn)行范圍掃描完成。例如,如果你預(yù)先計(jì)算一個(gè)固定位置的列 稱之為 position,可以重寫(xiě)查詢?nèi)缦拢?/p>

SELECT film_id, description FROM sakila.film
WHERE position BETWEEN 50 AND 54 ORDER BY position;

排序的數(shù)據(jù)也可以使用類似的方式解決,但是通常會(huì)被 GROUP BY操作影響。大部分情況下需要提前計(jì)算和存儲(chǔ)排序值。

LIMIT 和 OFFSET 真正的問(wèn)題是在OFFSET,這意味著服務(wù)端會(huì)把很多數(shù)據(jù)行丟棄。如果使用一個(gè)有序書(shū)簽來(lái)記錄下次獲取行的位置的話,則可以從上次的位置開(kāi)始訪問(wèn)接下來(lái)的數(shù)據(jù)。例如,如果你需要對(duì)出租記錄進(jìn)行分頁(yè),從最新的出租記錄開(kāi)始往回查詢,則可以依賴于記錄的主鍵是一直增加的,因此可以對(duì)第一頁(yè)數(shù)據(jù)這樣查詢:

SELECT * FROM sakila.rental
ORDER BY rental_id DESC LIMIT 20;

這個(gè)查詢返回16049到16030之間的數(shù)據(jù)。接下來(lái)的查詢可以從之前結(jié)束位置開(kāi)始:

SELECT * FROM sakila.rental
WHERE rental_id  16030 
ORDER BY rental_id DESC LIMIT 20;

這個(gè)技巧不管你從多遠(yuǎn)的偏移值開(kāi)始查詢都是很有效的。

其他的一些技巧包括使用預(yù)先計(jì)算的統(tǒng)計(jì)值,或者通過(guò)聯(lián)合冗余了主鍵和排序列的數(shù)據(jù)表進(jìn)行查詢,這兩種方式都是通過(guò)空間換取時(shí)間的方式提高查詢效率。

以上就是MySQL 分頁(yè)查詢的優(yōu)化技巧的詳細(xì)內(nèi)容,更多關(guān)于MySQL 分頁(yè)查詢的優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL 分組查詢的優(yōu)化方法
  • mysql查詢優(yōu)化之100萬(wàn)條數(shù)據(jù)的一張表優(yōu)化方案
  • 詳解MySQL 聯(lián)合查詢優(yōu)化機(jī)制
  • MySQL巧用sum、case和when優(yōu)化統(tǒng)計(jì)查詢
  • mysql千萬(wàn)級(jí)數(shù)據(jù)量根據(jù)索引優(yōu)化查詢速度的實(shí)現(xiàn)
  • MySQL查詢優(yōu)化必備知識(shí)點(diǎn)總結(jié)
  • mysql聚合統(tǒng)計(jì)數(shù)據(jù)查詢緩慢的優(yōu)化方法
  • MySQL之select in 子查詢優(yōu)化的實(shí)現(xiàn)
  • MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議
  • MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)
  • 理解MySQL查詢優(yōu)化處理過(guò)程

標(biāo)簽:迪慶 南充 徐州 龍巖 西寧 自貢 無(wú)錫 麗水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 分頁(yè)查詢的優(yōu)化技巧》,本文關(guān)鍵詞  MySQL,分頁(yè),查詢,的,優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 分頁(yè)查詢的優(yōu)化技巧》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL 分頁(yè)查詢的優(yōu)化技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    闻喜县| 鞍山市| 博乐市| 太白县| 武强县| 满城县| 桓台县| 天祝| 易门县| 蓬溪县| 高平市| 剑阁县| 太原市| 夏邑县| 离岛区| 桃江县| 新营市| 鄂州市| 黑山县| 道孚县| 泸定县| 武安市| 溧水县| 富民县| 麻栗坡县| 景谷| 乌恰县| 通河县| 旬邑县| 高青县| 滨海县| 巴南区| 襄樊市| 天等县| 宣化县| 乐陵市| 松溪县| 西城区| 库尔勒市| 阿尔山市| 惠安县|