整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          MySQL-SQL性能分析優化利器之Explain

          MySQL-SQL性能分析優化利器之Explain



          統性能的優劣取決于我們sql的查詢速度,MySQL Explain命令是分析SQL性能及優化不可缺少的一部分。

          Explain被我們稱為解釋器,通過 explain 我們可以知道以下信息:表的讀取順序,數據讀取操作的類型,可能會使用哪些索引,實際真正使用了哪些索引,表之間的引用,每張表有多少行被優化器查詢等信息。

          Explain基本語法

          explain [extended|partition]select

          在select前加explain關鍵字,MySQL會返回該查詢的執行計劃而不是執行這條SQL

          根據語法我們知道explain還有兩種其他的用法:

          1. explain extended :能夠在原本explain的基礎上額外的提供一些查詢優化的信息,這些信息可以通過mysql的show warnings命令得到,從而看出優化器優化了什么。

          2. explain partitions:相比 explain 多了個 partitions 字段,如果查詢是基于分區表的話,會顯示查詢將訪問的分區。

          Explain列的含義

          id:id列的編號是 select 的序列號,有幾個 select 就有幾個id,id不同,id值越大,優先級越高,越先 執行

          select_type :顯示本行是簡單或復雜select。如果查詢有任何復雜的子查詢,則最外層標記為 PRIMARY(DERIVED、UNION、UNION RESUlT)

          table :訪問查詢的表名或表別名|

          type :表的訪問類型( MySQL 如何查詢表中的行記錄)效率高低:const eq_ref/ref/range/index/all

          possible_keys:指出MySQL能使用哪個索引在該表中找到行

          key :MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL

          key_len :實際使用的索引長度(單位:字節)該字段顯示為索引字段的最大可能長度,并非實際使 用長度。

          ref :用于索引查找的值的來源,如果值未常量,則 ref 為 const

          rows :預計查詢需要掃描的行數(在表或索引樹中)

          filtered :查詢條件所過濾的行記錄數占比

          Extra:額外的信息:

          • Using filesort:說明mysql會對數據適用一個外部的索引排序。而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成排序操作稱為“文件排序”
          • Using temporary:使用了臨時表保存中間結果,mysql在查詢結果排序時使用臨時表。常見于排序order by和分組查詢group by。
          • Using index:表示相應的select操作用使用覆蓋索引,避免訪問了表的數據行。如果同時出現using where,表名索引被用來執行索引鍵值的查找;如果沒有同時出現using where,表名索引用來讀取數據而非執行查詢動作。
          • Using where :表明使用where過濾
          • using join buffer:使用了連接緩存
          • impossible where:where子句的值總是false,不能用來獲取任何元組
          • select tables optimized away:在沒有group by子句的情況下,基于索引優化Min、max操作或者對于MyISAM存儲引擎優化count(*),不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。
          • distinct:優化distinct操作,在找到第一匹配的元組后即停止找同樣值的動作

          詳細介紹列的含義

          1. id列

          id 的值為數值,其表示的是SQL執行中的執行順序,規則如下:

          • 如果 id 值相同,則執行順序為:從上到下
          • 如果 id 值不同,則執行順序為: id 值越大的越先執行
          • 如果 id 值相同,則可以認為他們是同一分組,同一分組中執行順序為:從上到下
          • 在所有組中, id 值越大的越先執行
          • 如果 id 值為 null ,則表示這是一個臨時表,臨時表不在SQL總出現,因此它的id是NULL

          MySQL將 select 查詢分為簡單查詢和復雜查詢。復雜查詢分為三類:簡單子查詢、派生表(from語句中的子查詢)、union 查詢。

          2. select_type列

          這一列表示的是對應行對應的查詢類型,到底是簡單查詢還是復雜查詢,如果是復雜的查詢,又是簡單子查詢、from語句中的子查詢、union 查詢復雜查詢中的哪一種。

          1. simple :簡單的select查詢,查詢中不包含子查詢或者 union

          2. primary:復雜查詢最外層的查詢類型

          3. subquery :在 select 或 where 列表中包含了子查詢

          4. derived:包含在 from 子句中的子查詢。MySQL會將結果存放在一個臨時表中,也稱為派生表

          5. union:union查詢語句出現在union之后的第二個和以后的查詢會被標為union類型

          6. union result:從 union 構建的臨時表檢索結果的查詢類型

          3. table列

          這一列看名稱就知道是指的具體查詢的table名稱。

          當 from 子句中有子查詢時,table列是 <derivenN> 格式,表示當前查詢依賴 id=N 的查詢,于是先執行 id=N 的查詢。當有 union 時,UNION RESULT 的 table 列的值為 <union1,2>,1和2表示參與 union 的 select 行id。

          4. type列

          這一列表示關聯類型或訪問類型,即MySQL決定如何查找表中的行

          最優到最差分別為:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

          1. const, system:Mysql查詢對其進行優化并轉化為一個常量,只查詢一次就搜索出結果,用于 primary key 或 unique key 的所有列與常數比較時,所以表最多有一個匹配行,讀取1次,速度比較快。

          2. eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描

          3. ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者聯合索引的部分前綴,索引要和某個值相比較,可能會找到多個符合條件的行.

          4. ref_or_null:與ref類型差不多,但是這種類型可以搜索為Null的行

          5. index_merge:使用了索引合并的優化方法

          6.range: 范圍掃描通常出現在 in(), between ,> ,<, >=等操作中。使用一個索引來檢索給定范圍的行

          7 index:Full Index Scan,Index與All區別為index類型只遍歷索引樹。這通常比ALL快,因為索引文件通常比數據文件小

          8. All:掃描全表,與index其實都是掃描全表進行檢索數據,區別在于,index類型是掃描索引樹進行數據掃描,而All類型則是直接掃磁盤,所以相對index類型比較慢

          5. possible_keys列

          顯示此次查詢可能會用到的索引,一個或者是多個,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定會應用。

          explain 時可能出現 possible_keys 有列,而 key 顯示 NULL 的情況,這種情況是因為表中數據不多,mysql認為索引對此查詢幫助不大,選擇了全表查詢。

          如果該列是NULL,則沒有相關的索引。在這種情況下,可以通過檢查 where 子句看是否可以創造一個適當的索引來提高查詢性能,然后用 explain 查看效果。但是有一種情況也可能會走索引,如果出現 覆蓋索引 的情況即使該列為null 依然有可能會走索引查詢

          6. key列

          mysql實際采用哪個索引來優化對該表的訪問,如果想強制指定索引或者忽視索引,可在查詢中使用 ***force index、ignore index***。

          7. key_len列

          表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好,key_len表示的是索引的最大長度,而不是實際使用長度。

          key_len計算規則如下:

          + 字符型

          • char(n):n字節長度
          • varchar(n):2字節存儲字符串長度,如果是utf-8,則長度 3n + 2

          + 數值型

          • tinyint:1字節
          • smallint:2字節
          • int:4字節
          • bigint:8字節

          + 時間類型

          • date:3字節
          • timestamp:4字節
          • datetime:8字節

          + 如果字段允許為 NULL,需要額外增加1字節記錄是否為 NULL

          8. ref列

          這一列顯示了在key列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),func,NULL,字段名

          9. rows列

          這一列表示這條SQL可能要檢索的數據行數,并不是返回結果集的行數。

          10.Extra列

          這一列展示的是一些額外的信息,但是也是十分重要的,對于我們提升SQL 的檢索性能是很有幫助的。

          常見的類型如下:

          • distinct: 一旦mysql找到了與行相聯合匹配的行,就不再搜索了
          • Using index:表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率還是非??捎^的。

          覆蓋索引:簡單的理解就是這次select的字段只從索引中就可以獲取的到,沒有必要再去浪費一次IO讀取行數據,換句話說就是查詢的列被索引列所覆蓋

          • Using where:就是使用了where條件查詢。mysql服務器將在存儲引擎檢索行后再進行過濾。就是先讀取整行數據,再按 where 條件進行檢查,符合就留下,不符合就丟棄。
          • Using temporary:mysql需要創建一張臨時表來處理查詢結果。出現這種情況一般是要進行優化的,首先是想到用索引來優化。這種類型常見于order by 和group by的查詢中
          • Using filesort:對查詢結果進行外部索引排序而不是按索引次序從表里讀取行,這種情況可以考慮建立索引來進行優化。

          參考文檔

          [Mysql官方文檔-explain](https://dev.mysql.com/doc/refman/8.0/en/explain-output.html)


          由于無法使用MarkDown 代碼部分已刪除,如需查看詳細代碼示例可瀏覽:[https://blog.csdn.net/liruichuan/article/details/103575911]

          .昨日回顧

          服務器軟件:Apache、IIS

          瀏覽器是一個翻譯官,是一個解釋器。瀏覽器可以翻譯有HTML、CSS、JavaScript。

          服務器端腳本程序:PHP、 .net、JSP、c#等

          .php文件要由PHP腳本引擎來進行處理。

          網站前臺(客戶端) 網站后臺(服務器端) 數據庫

          HTML(結構) PHP MySQL

          CSS JSP Oracle

          JavaScript .net SqlServer

          HTML結構:主要來說明,哪個地方是標題,哪個地方是段落,哪個地方是表格,哪個地方是表單。

          CSS表現(格式):主要功能是,給相對應的HTML標記定義各種各樣的格式。

          JavaScript行為:主要用于與計算機網頁進行交互(交流)。

          塊元素和行內元素

          塊元素:寬度單獨占一個通欄寬,塊元素的前臺的其它元素,都要另起一行來排。

          比如:<p> <pre> <hr> <h1>……<h6> <ul> <ol> <li>

          DIV和SPAN就是一個容器,容器中可以存放任何可以存放在<body>中的內容或標記。

          行內元素:行內元素沒有寬度和高度的概念,也就是說通過CSS無法給行內元素增加寬和高。多個行內元素會放在同一行,不會另起一行來排版。

          2.<marquee></marquee>滾動字幕標記:塊元素

          Direction:滾動的方向,取值:left、right、up、down

          Behavior:滾動的方式,取值:scroll(滾動)、 alternate(彈動)、 slide(滾動一次)

          Width:滾動的區域寬度,取值:px或%

          Height;滾動的區域高度

          bgColor:背景顏色,如:bgcolor=“#FF0000” bgcolor=“rgb(255,0,0)”

          scrollAmount:滾動步長值,一步走多遠,值越大,走的越快

          scrollDelay:兩次滾動的間隔時間,以毫秒為單位 1秒=1000毫秒

          3.計算機進制

          進制,就是一種進位方法。

          10進制:有10個基本數,0、1、2、3、4、5、6、7、8、9,運算規則是:逢十進一

          例如:9 10 19 20 29 30

          2進制:有2個基本數,0、 1,運算規則是:逢二進一。比如:(10)2 11 100 101 110

          8進制:有8個基本數,0、1、2、3、4、5、6、7,運算規則是:逢八進一。比如:(17)8 20 21 26 27 30

          因為二進制太長,不方便記憶,因此小型機引入了八進制,八進制可以很好的反應二進制。

          因此,一個八進制數,用3位二進制數來表示。

          基R=2^3

          16進制:有16個基本數,0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,運算規則是:逢16進一

          比如:EF F0 F1 F2 FE FF (100)16

          16進制的一位對應4位二進制?;鵕=2^4

          10進制12345678910111213141516171819
          2進制1101110010111011110001001101010111100
          8進制1234567101112131415161720
          16進制123456789ABCDEF10111213

          十進制轉成二進制

          分為整數部分和小數部分,分別轉換。比如:將(10.125)10轉成二進制? 1010.001

          (1)整數部分轉成二進制:2取余法。每次將整數除以2,取余數,一直除下去,直到整數部分(商)為0。最后讀數時,從下往上讀取。

          N整數10余數
          第1次10/250
          第2次5/221
          第3次2/210
          第4次1/201最后結果為:1010

          (2)小數部分轉成二進制:2除整法。每次將小數部分乘以2,取整數,一直乘下去,直到小數部分為0。最后讀數時,從上往下讀取。

          N小數0.125整數
          第1次0.125*20.250
          第2次0.25*20.50
          第3次0.5*21.01
          最后結果為:001

          二進制轉成十進制

          不分整數部分和小數部分,按權相加法。換句話說:二進制上的每一位,乘以所在位權(也就是2的幾次方),最后將各個位的乘相加,就能得到十進制。

          1010.001=1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 + 0*2^-1 + 0*2^-2 + 1*2^-3=8+2+ 1/8=10+0.125=10.125

          4.計算機編碼介紹(字符集)

          計算機只能二進制,比如:a-z、A-Z、0-9、標點符號,計算機都不能直接識別。每個人都可以來約定一套字符編碼(比如:a用二進制100表示,b用二進制101表示,c用二進制的110表示等)

          計算機是由美國人發明的,美國標準化局同樣制定了一套統一的編碼,叫ASCII碼。

          ASCII

          ASCII編碼用7位或8位(1個字節)二進制來表示,共可以表示128或256個字符。包括:大小寫字母、數字、標點符號、圖形符號等。

          5.ANSI編碼

          每個國家都想讓計算機能顯示或處理本國的語言,都對ASCII碼進行了擴展。

          在中國(簡體字),ANSI編碼是指GB2312或GBK。

          在臺灣(繁體字),ANSI編碼是指BIG5

          在日本,ANSI編碼是指JIS。

          ……

          注意:ANSI編碼是跟隨操作一齊安裝的,也就是,安裝了中文操作系統后,它的默認編碼就是GB2312。

          6.GB2312編碼

          GB2312是中國標準化局,在1980年制定的一套顯示簡體中文的編碼。

          GB2312是用2個字節來顯示。共可以表示2^16=256*256=65536個字符。

          GB2312共保存了6763個常用漢字,一級漢字3700個。

          GBK編碼

          對GB2312進行了擴充,可以顯示人名、古漢語中的一些罕見字等。

          GBK也是用2個字節來表示。共存儲了2.3萬個左右的中文字符。

          GBK的范圍,要比GB2312大的多。

          BIG5編碼

          BIG5用于臺灣、香港、澳門地區的繁體中文編碼。

          Unicode編碼

          用4個字節表示字符,共可以表示42個億個字符。

          Unicode編碼可以顯示世界上所有國家的語言。

          缺點:文件龐大,效率不高,不利于推廣。

          UTF-8統一格式轉換

          它會自動根據不同的字符,來選擇不同編碼長度。

          7.<meta>標記

          <meta>標記是設置一些網頁文件頭方面的信息。主要包括:網頁編碼或字符集設置、網頁關鍵字、網頁描述、網頁刷新跳轉等。相當于一封信的信封,信封有地址、郵編等重要。

          <head>標記中的內容在瀏覽器中,是不可見的。

          主要用兩個常用的屬性:

          http-equiv:主要設置一些控制信息,屬性值是固定的。比如:content-type

          name:一般用于設置網頁描述信息,像關鍵字、網頁描述、網頁版權、作者等,屬性值是固定的。比如:keywords

          content:是具體的參數或內容,與http-equiv和name屬性進行對應。

          (1)設置網頁的字符集或編碼

          <meta http-equiv=“content-type” content=“text/html;charset=GBK”>

          (2)設置網頁刷新或跳轉

          <meta http-equiv=“refresh” content=“5”> 表示每隔5秒鐘,刷新網頁

          <meta http-equiv=“refresh” content=“5;url=http://www.baidu.com”> 表示5秒鐘后,跳轉到百度網

          注意:刷新功能相當于瀏覽器中的刷新按鈕

          (3)設置網頁關鍵字(SEO優化),給搜索引擎(搜索機器人)使用

          <meta name=“keywords” content=“程序開發,平面設置,空間域名,網站維護”>

          (4)設置網頁描述信息(SEO優化)

          <meta name=“description” content=“廣州網站建設思優網絡公司,提供專業廣州網站制作及網站推廣相結合的建站方案,由專業廣州網站設計人員結合搜索引擎優化經驗為您設計網站;廣州網頁設計:020-87537332”>

          8.XHTML

          XHTML是可擴展超文本標注語言,XHTML是更純凈的HTML,語法更嚴格。

          XHTML的目的是為了取代HTML4.01。

          XHTML是W3C的一個標準或規范。

          編寫XHTML的規范,與HTML編寫有何不同?

          1)所有的標記都必須被關閉。比如:<br>轉換<br /> <hr>轉換后 <hr />

          2)XHTML要求所有的標記名稱必須小寫。比如:<meta><table><img><font>

          3)XHTML要求所有的屬性名必須小寫,屬性值必須加引號。

          4)XHTML要求所有的屬性必須有值。

          <hr noshade=noshade />

          <input type=radio checked=checked />

          5)所有的標記要順序嵌套,不能交叉嵌套;

          6)XHTML文件,必須要有DTD文檔類型定義;

          DTD(Document Type Define)文檔類型定義

          (1)嚴格型Strict

          要求HTML代中,不能存在任何的表現,用CSS去代替。比如:<font>、bgcolor、background等

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

          2)過渡型transitional

          可以使用任何表現的標記或屬性。

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

          (3)框架型Frameset

          制作框架網頁時使用的一種類型,框架主要用于網站的后臺管理。

          框架技術:是將一個瀏覽器窗口劃分成不同區域,每個區域(窗口)都可以顯示一個獨立的網頁。(HTML第四天單獨講框架,現在作個了解

          9.W3C簡介

          W3C是萬維網聯盟,是一個國際性的非盈利性組織,是WEB領域最具權威性的組織。已經制定多達200多項的標準。

          比如:XHTML、CSS、ECMAScript(JavaScript)、DOM、 XML等。

          10.超級鏈接

          超級鏈接的功能:就是點擊某個鏈接,可以跳轉到目標頁面或文件。

          超級鏈接的分類:

          (1)按內容分類:文本鏈接、圖片鏈接、多媒體等

          (2)按URL分類:相對URL、絕對URL、錨點

          URL,指網址或路徑

          URL(Uniform Resource Locator,統一資源定位器),也就是指互聯網地址。

          http://www.sina.com.cn/about/index.html

          第一個部分:協議,指訪問什么類型的服務器,如:http://FTP://、news://

          第二個部分:主機名或主機的IP地址。如:www.sina.com.cn

          第三個部分:文件夾名,如:about

          第四個部分:文件名,如:index.html

          11.<a></a>超級鏈接的標記

          格式:<a 屬性=“屬性值”>新浪網</a>

          常用的屬性:

          Href:指鏈接的目標文件或網址。比如:href=“http://www.toutiao.com”

          Target:指目標文件的打開方式。

          _blank:在新窗口中,來打開目標文件;

          _self:在當前窗口中,來打開目標文件;

          _top:在最頂層窗口中,來打開目標文件(在框架中講);

          _parent:在父窗口中,來打開目標文件(在框架中講)

          Name:設置錨點的名稱。錨點是指:鏈接到同一個頁面的不同部分

          舉例:<a href=http://www.toutiao.com target=“_blank”>頭條號</a>

          12.相對路徑和絕對路徑

          絕對URL:它總是以file:///協議開頭,去訪問目標文件。

          如果將當前文件移動到其它地方,這個絕對URL路徑不需要修改。

          絕對URL,只需要確定目標文件的路徑即可,與當前文件位置無關。

          例如:<a href=“file:///E:/itcast/20140510/lesson/day2/4.html”>本地絕對路徑</a>

          相對URL:要確定當前文件與目標文件的關系。

          關系分為三種:

          平級關系:直接寫目標文件的文件名即可。

          下級關系:也就是目標文件所在的文件夾與當前文件是平級關系,當前文件與目標文件是上下級關系。

          上級關系:目標文件位于上一層級。

          ../代表上一層文件夾

          ../../代表上二層文件夾

          ../../images/01.jpg

          提示:在制作網站時,一般使用的都是相對路徑。

          (3)下載鏈接:如果鏈接到的文件,網頁不能直接執行的話,都會出現下載提示。

          瀏覽器可以直接執行的文件:.gif、.jpg、.png、html、.htm、.mp3、.swf等

          (4)郵箱鏈接:mailto:beijing2000@126.com

          13.錨點鏈接:指鏈接到一個網頁的不同地方

          第一步:定義一個錨點或標記 <a name=“top”></a>

          第二步:鏈接到錨點或標記 <a href=“#top”>返回頂部</a>

          <a href=“intro.html#bottom”>鏈接到intro.html的底部</a>

          14.<img>圖片標記,單邊標記

          格式:<img 屬性=“屬性值” />

          常用的屬性:

          Src:指圖片的URL,可以是相對路徑,也可以是絕對路徑。

          Width:指圖片的寬度,單位px或%

          Height:指圖片的高度

          Align:圖片的水平對齊方式,取值:left center right ,leftright可以實現圖文混排

          Alt:如果圖片不存在時,顯示的提示信息

          Hspace:圖片左右的距離

          Vspace:圖片上下的距離

          舉例:<img src=“images/01.gif” width=“400” height=“300” alt=“寶寶圖片” />

          如果保證圖片在調整過程中不變形(等比例縮放):只需要設置widthheight其中一個即可,另一個會自動縮放。

          .HTTP協議簡介

          超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協作式和超媒體信息系統的應用層協議。

          就是常用的瀏覽器和服務器通信協議. 將tcp進行封裝后的一種應用層協議.

          2.HTTP工作原理

          HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

          以下是 HTTP 請求/響應的步驟:

          1. 客戶端連接到Web服務器
            一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.baidu.com。 默認80端口是不顯示的, 否則需要在域名后加入端口號.
          2. 發送HTTP請求
            通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
          3. 服務器接受請求并返回HTTP響應
            Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
          4. 釋放連接TCP連接
            若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
          5. 客戶端瀏覽器解析HTML內容
            客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然后解析每一個響應頭,響應頭告知以下為若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。

          例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:

          1. 瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
          2. 解析出 IP 地址后,根據該 IP 地址和默認端口 80,和服務器建立TCP連接;
          3. 瀏覽器發出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數據發送給服務器;
          4. 服務器對瀏覽器請求作出響應,并把對應的 html 文本發送給瀏覽器;
          5. 釋放 TCP連接;
          6. 瀏覽器將該 html 文本解析并顯示對應格式的內容;

          3.HTTP請求方法

          HTTP/1.1協議中共定義了八種方法來以不同方式操作指定的資源:

          GET

          向指定的資源發出“顯示”請求。使用GET方法應該只用在讀取數據,而不應當被用于產生“副作用”的操作中,例如在Web Application中。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。

          HEAD

          與GET方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在于,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中“關于該資源的信息”(元信息或稱元數據)。

          POST

          向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。

          PUT

          向指定資源位置上傳其最新內容。

          DELETE

          請求服務器刪除Request-URI所標識的資源。

          TRACE

          回顯服務器收到的請求,主要用于測試或診斷。

          OPTIONS

          這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用’*'來代替資源名稱,向Web服務器發送OPTIONS請求,可以測試服務器功能是否正常運作。

          CONNECT

          HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。通常用于SSL加密服務器的鏈接(經由非加密的HTTP代理服務器)。

          4.HTTP請求格式

          5.HTTP響應格式


          6.HTTP路由轉發

          路由是處理url和函數關系的程序,配置一系列的url訪問規則,提供對應url訪問的模板.在go的原生net/http包中,瀏覽器發起http請求(post,get等請求),到服務器中,服務器根據發送的url查找對應的出來程序,此查找程序為路程轉發程序.

          7.HTTP狀態碼

          所有HTTP響應的第一行都是狀態行,依次是當前HTTP版本號,3位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。

          狀態代碼的第一個數字代表當前響應的類型:

          • 1xx消息——請求已被服務器接收,繼續處理
          • 2xx成功——請求已成功被服務器接收、理解、并接受
          • 3xx重定向——需要后續操作才能完成這一請求
          • 4xx請求錯誤——請求含有詞法錯誤或者無法被執行
          • 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤

          有些是已經定義好的,比如200, 404等常見狀態碼,開發者也可以自行定義.

          8.一個簡單的HTTP服務器

          package main
           
          import (
              "fmt"
              "net/http"
          )
           
          func IndexHandler(w http.ResponseWriter, r *http.Request) {
              fmt.Fprintln(w, "hello world")
          }
           
          func main() {
              http.HandleFunc("/", IndexHandler)
              http.ListenAndServe("127.0.0.0:8000", nil)
          }
          123456789101112131415

          上述代碼中分析請求格式如下圖所示:

          可以看到上圖,請求頭,響應頭,請求方法為GET, 響應狀態碼為200.

          Content-Type: 傳輸的媒體類型.

          Content-Length: HTTP消息長度.

          等字段內容龐大,后續專門開一貼介紹.

          9.HTTP和MYSQL實現登錄功能

          一個簡單的登錄頁面,用戶登錄時填寫的賬號密碼從數據庫中讀出,并做對比

          index.html: 主頁顯示內容

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>index</title>
          </head>
          <body>
          歡迎訪問golang搭建的HttpServer
          </body>
          </html>
          12345678910

          login.html: 登錄頁面

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>用戶登錄</title>
          </head>
          <body>
          <form action="/loginForm" method="post">
              <span>{{.}}</span>
              username:<input type="text" name="username"/><br/>
              password:<input type="password" name="password"/><br/>
              <input type="submit" value="登錄"/>  
              <input type="reset" value="重置"/>
          </form>
          </body>
          </html>
          12345678910111213141516

          success.html: 登錄成功頁面

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>首頁</title>
          </head>
          <body>
          歡迎訪問golang搭建的HttpServer
          </body>
          </html>
          12345678910

          main.go: 服務器主程序


          主站蜘蛛池模板: 国产在线精品一区二区在线观看| 精品久久久中文字幕一区| www.亚洲一区| 国产精品免费视频一区| 无码人妻一区二区三区免费| 国产伦精品一区二区三区不卡| 无码中文人妻在线一区二区三区| 在线观看一区二区精品视频| 成人精品一区二区三区电影| 动漫精品第一区二区三区| 亚洲国产成人久久综合一区77| 久久国产精品一区二区| 色噜噜狠狠一区二区三区| 精品无码国产一区二区三区51安| 国产丝袜无码一区二区视频| 成人无码一区二区三区| 麻豆一区二区99久久久久| 国产中文字幕一区| 中文字幕一区二区人妻性色 | 一区二区三区视频| 国产一国产一区秋霞在线观看 | 无码人妻精品一区二区三区99仓本| 久久精品视频一区二区三区| 精品亚洲一区二区| 精品亚洲av无码一区二区柚蜜| 三上悠亚亚洲一区高清| 亚洲福利一区二区| 精品乱码一区二区三区在线| 无码精品人妻一区二区三区人妻斩| 成人欧美一区二区三区在线视频| 奇米精品一区二区三区在| 伊人色综合一区二区三区影院视频| 一区二区三区日本电影| 99久久精品午夜一区二区| 久久精品国产一区二区| 色婷婷av一区二区三区仙踪林| 国产日韩精品一区二区三区在线| 国产精品成人99一区无码| 亚洲一区在线视频观看| 91精品一区国产高清在线| 国产激情一区二区三区在线观看|