日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Mysql分頁(yè)&關(guān)聯(lián)查詢優(yōu)化

優(yōu)化關(guān)聯(lián)查詢

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、神池網(wǎng)站維護(hù)、網(wǎng)站推廣。

這個(gè)話題基本上整本書(shū)都在討論,這里需要特別提到的是:

  • 確保ON或者USING子句中的列上有索引。在創(chuàng)建索引的時(shí)候就要考慮到關(guān)聯(lián)的順序。
  • 當(dāng)表A和表B用列c關(guān)聯(lián)的時(shí)候,如果優(yōu)化器的關(guān)聯(lián)順序是B、A,那么就不需要在B表的對(duì)應(yīng)列上建上索引。沒(méi)有用到的索引只會(huì)帶來(lái)額外的負(fù)擔(dān)。一般來(lái)說(shuō),除非有其他理由,否則只需要在關(guān)聯(lián)順序中的第二個(gè)表的相應(yīng)列上創(chuàng)建索引。
  • 確保任何的GROUP BY和ORDER BY中的表達(dá)式只涉及到一個(gè)表中的列,這樣MySQL才有可能使用索引來(lái)優(yōu)化這個(gè)過(guò)程。

當(dāng)升級(jí)MySQL的時(shí)候需要注意:關(guān)聯(lián)語(yǔ)法、運(yùn)算符優(yōu)先級(jí)等其他可能會(huì)發(fā)生變化的地方。因?yàn)橐郧笆瞧胀P(guān)聯(lián)的地方可能會(huì)變成笛卡兒積,不同類型的關(guān)聯(lián)可能會(huì)生成不同的結(jié)果

優(yōu)化LIMIT分頁(yè)

在系統(tǒng)中需要進(jìn)行分頁(yè)操作的時(shí)候,我們通常會(huì)使用LIMIT加上偏移量的辦法實(shí)現(xiàn),同時(shí)加上合適的ORDER BY子句。如果有對(duì)應(yīng)的索引,通常效率會(huì)不錯(cuò),否則,MySQL需要做大量的文件排序操作。

一個(gè)非常常見(jiàn)又令人頭疼的問(wèn)題就是,在偏移量非常大的時(shí)候注”,例如可能是LIMIT1000,20這樣的查詢,這時(shí)MySQL需要查詢1 0 020條記錄然后只返回***20條,前面10 000條記錄都將被拋棄,這樣的代價(jià)非常高。如果所有的頁(yè)面被訪問(wèn)的頻率都相同,那么這樣的查詢平均需要訪問(wèn)半個(gè)表的數(shù)據(jù)。要優(yōu)化這種查詢,要么是在頁(yè)面中限制分

頁(yè)的數(shù)量,要么是優(yōu)化大偏移量的性能。

優(yōu)化此類分頁(yè)查詢的一個(gè)最簡(jiǎn)單的辦法就是盡可能地使用索引覆蓋掃描,而不是查詢所有的列。然后根據(jù)需要做一次關(guān)聯(lián)操作再返回所需的列。對(duì)于偏移量很大的時(shí)候,這樣做的效率會(huì)提升非常大??紤]下面的查詢:

 
 
 
 
  1. mysql> SELECT film_id,description FROM sakila.film ORDER BY title LIHIT 50,5;

如果這個(gè)表非常大,那么這個(gè)查詢***改寫(xiě)成下面的樣子:

 
 
 
 
  1. mysql> SELECT film.film_id,Film.description
  2. -> FROM sakila.film
  3. ->INNER JOIN(
  4. -> SELECT film.film_id FROM sakila.film
  5. -> ORDER BY title LIMIT 50,5
  6. ->) AS lim USING(film_id);

這里的“延遲關(guān)聯(lián)”將大大提升查詢效率,它讓MySQL掃描盡可能少的頁(yè)面,獲取需要訪問(wèn)的記錄后再根據(jù)關(guān)聯(lián)列回原表查詢需要的所有列。這個(gè)技術(shù)也可以用于優(yōu)化關(guān)聯(lián)查詢中的LIMIT子句。

有時(shí)候也可以將LIMIT查詢轉(zhuǎn)換為已知位置的查詢,讓MySQL通過(guò)范圍掃描獲得到對(duì)應(yīng)的結(jié)果。例如,如果在一個(gè)位置列上有索引,并且預(yù)先計(jì)算出了邊界值,上面的查詢就可以改寫(xiě)為:

 
 
 
 
  1. mysql> SELECT film_id, description FROM sakila.Film
  2. -> WHERE position BETWEEN so AND 54 0RDER BY position;

對(duì)數(shù)據(jù)進(jìn)行排名的問(wèn)題也與此類似,但往往還會(huì)同時(shí)和GROUP BY混合使用。在這種情況下通常都需要預(yù)先計(jì)算并存儲(chǔ)排名信息。

LIMIT和OFFST的問(wèn)題,其實(shí)是OFFSET的問(wèn)題.它會(huì)導(dǎo)致MySQL掃描大量不需要的行然后再拋棄掉。如果可以使用書(shū)簽記錄上次取數(shù)據(jù)的位置,那么下次就可以直接從該書(shū)簽記錄的位置開(kāi)始掃描,這樣就可以避免使用OFFSET。例如,若需要按照租借記錄做翻頁(yè),那么可以根據(jù)***一條租借記錄向后追溯,這種做法可行是因?yàn)樽饨栌涗浀闹麈I是單調(diào)增長(zhǎng)的。首先使用下面的查詢獲得***組結(jié)果:

 
 
 
 
  1. mysql> SELECT * FROM sakila.rental
  2. -> ORDER BY rental id DESC LIMIT 20;

假設(shè)上面的查詢返回的是主鍵為1 6 049到1 6 03 0的租借記錄,那么下一頁(yè)查詢就可以從1 6 030這個(gè)點(diǎn)開(kāi)始:

 
 
 
 
  1. mysql> SELECT * FROM sakila*rental
  2. -> WHERE rental id < 16030,
  3. -> ORDER BY rental id DESC LIMIT 20;

該技術(shù)的好處是無(wú)論翻頁(yè)到多么后面,其性能都會(huì)很好。

其他優(yōu)化辦法還包括使用預(yù)先計(jì)算的匯總表,或者關(guān)聯(lián)到一個(gè)冗余表,冗余表只包含主鍵列和需要做排序的數(shù)據(jù)列。還可以使用Sphinx優(yōu)化一些搜索操作,參考附錄F可以獲得更多相關(guān)信息。


新聞名稱:Mysql分頁(yè)&關(guān)聯(lián)查詢優(yōu)化
當(dāng)前網(wǎng)址:http://m.5511xx.com/article/dhgsoig.html