統性能的優劣取決于我們sql的查詢速度,MySQL Explain命令是分析SQL性能及優化不可缺少的一部分。
Explain被我們稱為解釋器,通過 explain 我們可以知道以下信息:表的讀取順序,數據讀取操作的類型,可能會使用哪些索引,實際真正使用了哪些索引,表之間的引用,每張表有多少行被優化器查詢等信息。
explain [extended|partition]select
在select前加explain關鍵字,MySQL會返回該查詢的執行計劃而不是執行這條SQL
根據語法我們知道explain還有兩種其他的用法:
1. explain extended :能夠在原本explain的基礎上額外的提供一些查詢優化的信息,這些信息可以通過mysql的show warnings命令得到,從而看出優化器優化了什么。
2. explain partitions:相比 explain 多了個 partitions 字段,如果查詢是基于分區表的話,會顯示查詢將訪問的分區。
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:額外的信息:
1. id列
id 的值為數值,其表示的是SQL執行中的執行順序,規則如下:
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計算規則如下:
+ 字符型
+ 數值型
+ 時間類型
+ 如果字段允許為 NULL,需要額外增加1字節記錄是否為 NULL
8. ref列
這一列顯示了在key列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),func,NULL,字段名
9. rows列
這一列表示這條SQL可能要檢索的數據行數,并不是返回結果集的行數。
10.Extra列
這一列展示的是一些額外的信息,但是也是十分重要的,對于我們提升SQL 的檢索性能是很有幫助的。
常見的類型如下:
覆蓋索引:簡單的理解就是這次select的字段只從索引中就可以獲取的到,沒有必要再去浪費一次IO讀取行數據,換句話說就是查詢的列被索引列所覆蓋
參考文檔
[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無法給行內元素增加寬和高。多個行內元素會放在同一行,不會另起一行來排版。
Direction:滾動的方向,取值:left、right、up、down
Behavior:滾動的方式,取值:scroll(滾動)、 alternate(彈動)、 slide(滾動一次)
Width:滾動的區域寬度,取值:px或%
Height;滾動的區域高度
bgColor:背景顏色,如:bgcolor=“#FF0000” bgcolor=“rgb(255,0,0)”
scrollAmount:滾動步長值,一步走多遠,值越大,走的越快
scrollDelay:兩次滾動的間隔時間,以毫秒為單位 1秒=1000毫秒
進制,就是一種進位方法。
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進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2進制 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | |||||||
8進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | |||
16進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 |
十進制轉成二進制
分為整數部分和小數部分,分別轉換。比如:將(10.125)10轉成二進制? 1010.001
(1)整數部分轉成二進制:除2取余法。每次將整數除以2,取余數,一直除下去,直到整數部分(商)為0。最后讀數時,從下往上讀取。
第N次 | 整數10 | 商 | 余數 | ||
第1次 | 10/2 | 5 | 0 | ||
第2次 | 5/2 | 2 | 1 | ||
第3次 | 2/2 | 1 | 0 | ||
第4次 | 1/2 | 0 | 1 | 最后結果為:1010 | |
(2)小數部分轉成二進制:乘2除整法。每次將小數部分乘以2,取整數,一直乘下去,直到小數部分為0。最后讀數時,從上往下讀取。
第N次 | 小數0.125 | 積 | 整數 | ||
第1次 | 0.125*2 | 0.25 | 0 | ||
第2次 | 0.25*2 | 0.5 | 0 | ||
第3次 | 0.5*2 | 1.0 | 1 | ||
最后結果為: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
計算機只能二進制,比如:a-z、A-Z、0-9、標點符號,計算機都不能直接識別。每個人都可以來約定一套字符編碼(比如:a用二進制100表示,b用二進制101表示,c用二進制的110表示等)
計算機是由美國人發明的,美國標準化局同樣制定了一套統一的編碼,叫ASCII碼。
ASCII碼
ASCII編碼用7位或8位(1個字節)二進制來表示,共可以表示128或256個字符。包括:大小寫字母、數字、標點符號、圖形符號等。
每個國家都想讓計算機能顯示或處理本國的語言,都對ASCII碼進行了擴展。
在中國(簡體字),ANSI編碼是指GB2312或GBK。
在臺灣(繁體字),ANSI編碼是指BIG5
在日本,ANSI編碼是指JIS。
……
注意:ANSI編碼是跟隨操作一齊安裝的,也就是,安裝了中文操作系統后,它的默認編碼就是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統一格式轉換
它會自動根據不同的字符,來選擇不同編碼長度。
<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”>
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第四天單獨講框架,現在作個了解)
W3C是萬維網聯盟,是一個國際性的非盈利性組織,是WEB領域最具權威性的組織。已經制定多達200多項的標準。
比如:XHTML、CSS、ECMAScript(JavaScript)、DOM、 XML等。
超級鏈接的功能:就是點擊某個鏈接,可以跳轉到目標頁面或文件。
超級鏈接的分類:
(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
格式:<a 屬性=“屬性值”>新浪網</a>
常用的屬性:
Href:指鏈接的目標文件或網址。比如:href=“http://www.toutiao.com”
Target:指目標文件的打開方式。
_blank:在新窗口中,來打開目標文件;
_self:在當前窗口中,來打開目標文件;
_top:在最頂層窗口中,來打開目標文件(在框架中講);
_parent:在父窗口中,來打開目標文件(在框架中講)
Name:設置錨點的名稱。錨點是指:鏈接到同一個頁面的不同部分
舉例:<a href=http://www.toutiao.com target=“_blank”>頭條號</a>
絕對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
第一步:定義一個錨點或標記 <a name=“top”></a>
第二步:鏈接到錨點或標記 <a href=“#top”>返回頂部</a>
<a href=“intro.html#bottom”>鏈接到intro.html的底部</a>
格式:<img 屬性=“屬性值” />
常用的屬性:
Src:指圖片的URL,可以是相對路徑,也可以是絕對路徑。
Width:指圖片的寬度,單位px或%
Height:指圖片的高度
Align:圖片的水平對齊方式,取值:left center right ,left或right可以實現圖文混排
Alt:如果圖片不存在時,顯示的提示信息
Hspace:圖片左右的距離
Vspace:圖片上下的距離
舉例:<img src=“images/01.gif” width=“400” height=“300” alt=“寶寶圖片” />
如果保證圖片在調整過程中不變形(等比例縮放):只需要設置width和height其中一個即可,另一個會自動縮放。
超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協作式和超媒體信息系統的應用層協議。
就是常用的瀏覽器和服務器通信協議. 將tcp進行封裝后的一種應用層協議.
HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。
以下是 HTTP 請求/響應的步驟:
例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:
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代理服務器)。
路由是處理url和函數關系的程序,配置一系列的url訪問規則,提供對應url訪問的模板.在go的原生net/http包中,瀏覽器發起http請求(post,get等請求),到服務器中,服務器根據發送的url查找對應的出來程序,此查找程序為路程轉發程序.
所有HTTP響應的第一行都是狀態行,依次是當前HTTP版本號,3位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。
狀態代碼的第一個數字代表當前響應的類型:
有些是已經定義好的,比如200, 404等常見狀態碼,開發者也可以自行定義.
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消息長度.
等字段內容龐大,后續專門開一貼介紹.
一個簡單的登錄頁面,用戶登錄時填寫的賬號密碼從數據庫中讀出,并做對比
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: 服務器主程序
*請認真填寫需求信息,我們會在24小時內與您取得聯系。