好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL中(JOIN/ORDER BY)語句的查詢過程及優化方法

MySQL中(JOIN/ORDER BY)語句的查詢過程及優化方法

熱門標簽:電話機器人的價格多少錢一個月 福建外呼電銷機器人加盟 百度地圖標注要什么軟件 天津公司外呼系統軟件 400電話申請廠家現貨 自己做地圖標注需要些什么 中國地圖標注公司 昌德訊外呼系統 徐涇鎮騰訊地圖標注

在MySQL查詢語句過程和EXPLAIN語句基本概念及其優化中介紹了EXPLAIN語句,并舉了一個慢查詢例子:

可以看到上述的查詢需要檢查1萬多記錄,并且使用了臨時表和filesort排序,這樣的查詢在用戶數快速增長后將成為噩夢。

在優化這個語句之前,我們先了解下SQL查詢的基本執行過程:

1.應用通過MySQL API把查詢命令發送給MySQL服務器,然后被解析

2.檢查權限、MySQL optimizer進行優化,經過解析和優化后的查詢命令被編譯為CPU可運行的二進制形式的查詢計劃(query plan),并可以被緩存

3.如果存在索引,那么先掃描索引,如果數據被索引覆蓋,那么不需要額外的查找,如果不是,根據索引查找和讀取對應的記錄

4.如果有關聯查詢,查詢次序是掃描第一張表找到滿足條件的記錄,按照第一張表和第二張表的關聯鍵值,掃描第二張表查找滿足條件的記錄,按此順序循環

5.輸出查詢結果,并記錄binary logs

顯然合適的索引將大大簡化和加速查找。再看一下上面那條查詢語句,除了條件查詢外,還有關聯查詢以及ORDER BY即排序操作,

那么讓我們進一步了解下關聯查詢(JOIN)和ORDER BY是怎么工作的,MySQL有三種方式來處理關聯查詢和數據排序:

第一種方法是基于索引,第二種是對第一個非常量表進行filesort(quicksort),還有一種是把聯合查詢的結果放入臨時表,然后進行filesort。

注1:關于什么是非常量表,請參考閱讀MySQL開發手冊:Consts and Constant Tables,
注2:什么是filesort呢,這不是字面意思的文件排序,filesort有兩種模式:
1、模式1:排序后的元素涵蓋了要輸出的數據。排序結果是一串有序序列元素組,不再需要額外的記錄讀取;
2、模式2:排序結果是sort_key,row_id>鍵值對序列,通過這些row_ids再去讀取記錄(隨機讀取,效率低下);
注3:關于什么是臨時表,請參考閱讀MySQL開發手冊:How MySQL Uses Internal Temporary Tables

第一種方法用于第一個非常量表中存在ORDER BY所依賴的列的索引,那就可直接使用已經有序的索引來查找關聯表的數據,這種方式是性能最優的,因為不需要額外的排序動作:

第二種方式用于ORDER BY所依賴的列全部屬于第一張查詢表且沒有索引,那么我們可以先對第一張表的記錄進行filesort(模式可能是模式1也可能是模式2),得到有序行索引,然后再做關聯查詢,filesort的結果可能是在內存中,也可能在硬盤上,這取決于系統變量sort_buffer_size(一般為2M左右):

第三種方法用于當ORDER BY的元素不屬于第一張表時,需要把關聯查詢的結果放入臨時表,最后對臨時表進行filesort:

第三種方法中的臨時表,可能是在內存中(in-memory table),也可能是在硬盤上,一般是下面兩種情況會使用硬盤(on-disk table):

(1)使用了BLOB,TEXT類型的數據

(2)內存表占用超過了系統變量tmp_table_size/max_heap_table_size的限定(一般為16M左右),只能放在硬盤上

從上面的查詢執行過程和方式,我們應該可以清楚的知道為什么Using filesort,Using temporary會嚴重的影響查詢性能,因為如果數據類型或者字段設計有問題,

在需要查詢的表以及結果中存在大數據的字段,而沒有合適的索引可用時,都可能會導致產生大量的IO操作,這就是查詢性能緩慢的根源所在。

回到文章開頭所舉的查詢實例,它顯然是使用了效率最低的第三種方法,我們需要做和嘗試的優化手段有:

1、為users.fl_no添加索引,為select和where所使用的字段建立索引

2、把users.fl_no轉移到或者作為冗余字段添加到表user_profile中

3、去除TEXT類型的字段,TEXT可以替換為VARCHAR(65535)或對于中文而言VARCHAR(20000)

4、如果實在無法消除Using filesort,那么提高sort_buffer_size,以減少IO操作負擔

5、盡量使用第一張表所覆蓋的索引進行排序,實在不行,可以把排序邏輯從MySQL中移到PHP/Java程序中執行

實施1、2、3的優化方法后,EXPLAIN結果如下:

備注:編寫簡單的PHP應用,用siege測試,查詢效率提高>3倍。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • MYSQL使用inner join 進行 查詢/刪除/修改示例
  • MySQL查詢優化:連接查詢排序limit(join、order by、limit語句)介紹
  • MySQL優化之使用連接(join)代替子查詢
  • mysql多個left join連接查詢用法分析
  • mysql使用from與join兩表查詢的區別總結
  • mysql中各種常見join連表查詢實例總結
  • MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)
  • Mysql連接join查詢原理知識點
  • MySQL聯表查詢基本操作之left-join常見的坑
  • mysql高效查詢left join和group by(加索引)

標簽:黔西 駐馬店 梅河口 北京 荊門 陜西 昌都 鄂爾多斯

巨人網絡通訊聲明:本文標題《MySQL中(JOIN/ORDER BY)語句的查詢過程及優化方法》,本文關鍵詞  MySQL,中,JOIN,ORDER,語句,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL中(JOIN/ORDER BY)語句的查詢過程及優化方法》相關的同類信息!
  • 本頁收集關于MySQL中(JOIN/ORDER BY)語句的查詢過程及優化方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 女人脱了内裤让男人添j| 激情在线一区二区| 调教丝袜乘务长| 国产不卡的一区二区三区四区| 国产ChineseHDXXXⅩ| 乖?好舒服?把腿张开蜜桃小说| 欧美激情中文一区二区| 公的粗大2| 性生活技巧| 舔狗前夫强撩我| jalapkino69| 美女张开腿让男人桶网站| 秀人网大尺度| 9 1免费版下载安装安卓手机| 男啪女| 中文字幕日韩女同互慰视频| 1024国产手机视频基地| 午夜无码人妻AⅤ大片大象传媒 | 国产精品久久久久精品电影影院| 美女被到爽视频网站| 母娘家庭教师| 國產精品久久91蜜桃swag| 《彼女の调教》在线观看| 精品国产成a人在线观看| 免费看女生隐私的app| 夜月直播在线播放视频| 国产裸体美女一级A片真人做受 | 国模高清xxxxx视频| 国产精品成人观看视频网站| 2020国产精品视频| 嗯哼~我受不了了快停下学长 | 精品国产一区二区三区,| 欧美成人激情视频| 国产在线欧美精品中文一区| 青草精品在线| 飘雪电影在线观看免费高清| 久久综合亚洲色hezyo国产| brazzersxxx欧美| 久久免费看少妇高潮A片古代 | 性欧美大战久久久久久久野外黑人| 欧美大尺度无遮挡AV在线观看|