统性能的优劣取决于我们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位二进制。基R=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协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、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小时内与您取得联系。