MySQL中的运算符

在MySQL中,常量数字默认会以8个字节来表示,8个字节就是64位。
TRUNCATE仅仅是进行截断,而不进行四舍五入:
mysql> select ROUND(1.235,2),TRUNCATE(1.235,2);
+----------------+-------------------+
| ROUND(1.235,2) | TRUNCATE(1.235,2) |
+----------------+-------------------+
| 1.24 | 1.23 |
+----------------+-------------------+
INET_ATON和INET_NTOA主要用途是将字符串的IP地址转化为数字表示的网络字节序:
mysql> select INET_ATON('192.168.1.1');
+--------------------------+
| INET_ATON('192.168.1.1') |
+--------------------------+
| 3232235777 |
+--------------------------+
1 row in set (0.01 sec)

mysql> select INET_NTOA('3232235777');
+-------------------------+
| INET_NTOA('3232235777') |
+-------------------------+
| 192.168.1.1             |
+-------------------------+
1 row in set (0.00 sec)

查看当前数据库支持的存储引擎

mysql> SHOW ENGINE \G;

Innodb 外键约束

在创建索引时,可以指定在删除、更新父表时,对子表进行的响应操作,包括RESTRICT、CASCADE、SET NULL和NO ACTION。

当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

TEXT与BLOB

BLOB能用来保存二进制数据,比如照片;而TEXT只能用来保存字符数据,比如一篇文章或日记。

OPTIMIZE TABLE碎片整理功能,可以回收“空洞”空间。
可以使用合成的索引来提高大文本字段的查询功能。

浮点数与定点数

定点数实际上是以字符串形式存放的。
浮点数存在误差问题,尽量避免做浮点数比较。

字符集

字符集概述

字符集就是一套文字符号及其编码、比较规则的集合。

####mysql支持的字符集简介
MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。其中字符集用来定义MySQL存储字符串的方式,校对规则用来定义比较字符串的方式。字符串和校对规则是一对多的关系。

校对集结尾:
_ci:大小写不敏感
_cs:大小写敏感
_bin:按照编码的值进行比较,对大小写敏感

MySQL字符集的设置

MySQL字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。

负载均衡

吞吐量:每秒处理的请求数

合理部署服务器:在基于IP寻址的互联网中,IP地址相近的主机之间通信,数据经过少数的路由器即可到达。

负载均衡

  1. 简单的http重定向
    2.基于DNS的轮询解析
    3.反向代理服务器
    4.LVS构建服务器集群

铜线传输的是电信号,光纤传送的是光信号。

IP地址转换为MAC地址:
数据发送端通过ARP协议发送广播到局域网内所有的主机,询问大家谁拥有指定的IP地址,如果拥有的话就请告知自己的MAC地址。

ARP绑定:将局域网内其他主机网卡的MAC地址和IP地址的对应关系写入ARP表。

发货人和收货人:
相当于建立通信的两个主机上运行的进程,发货人和收货人的详细信息相当于这些进程的网络端口号。

传输层协议包括TCP和UDP

礼品包、订购包、产品包:
对数据进行再次封装,包括头部信息和正文,比如HTTP、FTP、SSH等。

带宽:数据的传输速度 bit/s

数据如何发送

1.首先应用程序得先将要发送的数据写入该进程的内存地址空间中
2.应用程序通过系统函数库接口(比如send函数)向内核发出系统调用,由系统内核来进行随后的操作
3.当数据写入内核缓冲区后,内核会通知网卡控制器前来取数据,同时CPU转而处理其他进程。
4.网卡缓冲区中的数据需要发送到线路上中,同时释放缓冲区来获取更多要发送的数据。
5.发送时,网卡会使用内部特定的物理装置来生成可以传播的各种信号。比如铜线线路,网卡会根据0和1的变化产生不同的电信号,而使用光纤线路时,网卡会产生不同的光信号。

数据发送速度

1.数据发送装置的发送能力和接收装置的接收能力(总线频率)
2.数据传播介质的并行度,线路“宽度”。(总线宽度)
信号在传播介质中存在衰减,光信号少于电信号,所以光信号更适合于远距离传输数据

限制带宽

通过限制交换机对于你主机的数据接收速度来控制你主机的出口带宽,因为数据链路层的流量控制是通过控制接收方来实现的。

响应时间

响应时间=发送时间+传播时间+处理时间
在两台主机之间往往存在多个交换节点,每次的数据交换都需要花费时间。

一些习惯和约定

比特的单位(bit)缩写为b,而将字节的的单位(Byte)缩写为B
1KB=1024B

网卡需要将线路中的电信号或者光信号转换为计算机可以识别的字节流。

影响下载速度的几个因素

1.通过浏览器下载是基于http协议的,每个IP数据包还得额外附加网络协议等信息,所以实际传输的文件数据要小于网络流量。
2.在共享带宽以及网络通信数据量过大时,交换节点中数据在转发队列中等待的时间也不可忽略。
3.数据需要写入磁盘,单线程的下载过程中接收数据并不是绝对连贯的。
4.长距离传播需要经过中继器,接收和转发存在时间消耗。

吞吐率

定义:单位时间内服务器处理的请求数,单位reqs/s.(指在一定并发用户的情况下,服务器处理请求能力的量化体现)

每个用户的并发下载数可以是多个,多线程。

最大并发连接数和最大并发用户数从本质上来说是不同的

web服务器所做的工作的本质就是争取以最快的速度将内核缓冲区的用户请求数据一个不剩的拿回来,然后尽最大努力同时快速处理完这些请求,并将响应数据放到内核维护的另一块用户发送数据的缓冲区中,接下来再尽快处理下一波请求。

进程

多执行流的一般实现便是进程。
I/O主要指磁盘I/O和网络I/O
进程的调度由内核来进行,每个进程都有自己的内存地址空间和生命周期,多个进程通过不同的进程描述符与这些数据进行关联。进程的创建使用fork()系统调用。

线程

从内核的角度看来,多线程只是一个普通的进程,他是由用户态通过一些库函数模拟实现的多执行流,所以多线程的管理完全在用户态完成。

cat /proc/loadavg

内存分配

nginx使用多线程来处理请求,这使得多个线程之间可以共享内存资源,从而令他的整体内存使用量大大减少。另外,它使用分阶段的内存分配策略,按需分配,及时释放,使得内存使用量保持在很小的数量范围。

持久连接

持久连接(Keep-Alive)有时候也成为长连接,它是TCP通信的一种普通方式,即在一次TCP连接中持续发送多份数据而不断开连接。

对于Apache这样的多进程模型来说,如果长连接超时时间过长,比如60秒,那么即使是浏览器没有任何请求,而Apache仍然维持着连接该浏览器的子进程,一旦并发用户较多,那么Apache将维持着大量的空闲进程,严重影响了服务器性能。
Nginx多线程,apache多进程

web服务器并发策略

内存映射

共享型和私有型

web服务器并发策略

1.一个进程处理一个连接,非阻塞I/O(apache)
2.一个线程处理一个连接,非阻塞I/O(虽然它使用大量的线程代替进程,但是这些线程实际上都是由内核进程调度器管理的轻量级进程,他们的上下文切换开销依然存在。prefork和worker模型)
3.一个进程处理多个连接,非阻塞I/O(一个进程处理多个连接的潜在条件是多路I/O就绪通知的应用)
通常我们将处理多个连接的进程成为worker进程,或者服务进程。
4.一个线程处理多个连接,异步I/O

浏览器缓存

事实上动态内容一般不存在传统意义上的最后修改时间,静态文件可以通过stat()系统调用获得它在物理文件系统中的最后修改时间,一般web服务器会为静态文件的http响应自动生成最后修改时间。

ctrl+f5:强制刷新,不使用缓存协商,获取所有内容的最新版本。
f5:一般的刷新,能够让Last-Modified发挥效果,但是对Expires无效。
单击浏览器地址栏的“转到”按钮或者通过超链接跳转到此页:浏览器会对没有过期的内容直接使用本地缓存,所以Expires只对这种方式有效。

Last-Modified:Tue,24 Mar 2017 04:31:03 GMT
Cache-Control:max-age=3600 (优先级高于Expires,解决时差问题)
Expires:Tue,24 Mar 2017 05:31:03 GMT

如果没有Expires,但是信息头里包含Last-Modified时间,那么web服务器缓存区会使用默认最大缓存时间。

反向代理

传统代理服务器:用户隐藏在代理服务器之后
反向代理服务器:web服务器隐藏在代理服务器之后

反向代理的主要目的是:基于缓存的加速。
nginx和lighttpd的优势主要体现在网络I/O模型上。

也可以多台反向代理服务器指向同一后端web服务器。

nginx常用配置

proxy_pass http://localhost:8001;
proxy_set_header X-Real-IP $remote_addr;

后端服务器想告知浏览器一些额外的信息,也可以通过在响应的HTTP头信息中携带一定的自定义信息穿过反向代理。比如:
header("X-Real-Server-IP:10.0.1.10");

组建内部私有网络,目的是让反向代理服务器和后端服务器通过内网交换机来交换数据,同时,我们需要为反向代理服务器和后端服务器都配备双网卡,并设置私有ip地址。