1.首先应考虑在 where 及 order by 涉及的列上建立索引。索引不能过多,不利于删除,插入等操作。

2.应尽量避免在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描

3.应尽量避免在 where 子句中使用!=或<>操作符,将引擎放弃使用索引而进行全表扫描

4.应尽量避免在 where 子句中使用 or 来连接条件,将导致引擎放弃使用索引而进行全表扫描

5.合理使用like模糊查询,不要乱用

6.不要在 where 子句中进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

7.不要写一些没有意义的查询

8.很多时候用 exists 代替 in 是一个好的选择

9.选择合适的字段类型,尽量使用数字型字段。

15.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间

16.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

17.避免频繁创建和删除临时表,以减少系统表资源的消耗。


服务器层次

负载均衡;

针对不同地区进行分区部署;

服务器配置;

如果数据量返回较大,请启用gzip模式

缓存

前端缓存:将页面缓存到缓存服务器,比如pagecache等

后端缓存:将数据存储到redis等数据库中

数据库层次

数据库引擎选择:innodb和myisam

合适的字段类型;

反范式的数据表;

建立正确的索引(重要);

数据库分区,不要跨区访问,比如国内访问国外的数据库。尽量将数据库和web服务器同一地区,甚至同一局域网(比如直接通过容器访问)

读写分离,主从同步;

请求层次

减少接口请求次数,尽量一次性将数据返回;

gzip将压缩结果返回给前端,而不是原格式化的数据。

代码层次

不要写死循环;

尽量用高效代码,比如:

用 && 而用and等;

尽量少用正则去匹配;

字符串尽量单引号,双引号需要翻译变量;

https://new.qq.com/rain/a/20230406A00Q8T00

终端层次

部分数据可以直接缓存到页面,而不是每次都请求接口。




一台计算机的计算资源是有效的,当超大流量请求时,就可能导致请求等待或者服务器死机的情况,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。


一、定义

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。

二、用途

正向代理

突破访问显示:通过代理服务器,可以突破自身ip访问限制,访问国外网站等;

提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;

提高客户端的安全性和性能。

反向代理

负载均衡:根据服务器的负载情况,将客户端请求分发到不同的真实服务器上,从而避免过载;

提高访问速度:反向代理服务器可以对静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度;

防止被攻击:如果网站使用反向代理,则其服务器地址是隐藏的;

缓存:反向代理服务器可以用来缓存网站内容,提高网站性能;

SSL加密:为每个用户加密和解密安全套接字层(SSL)通信对于源服务器可能无效,反向代理可以通过加密和解密所有请求来完成这项工作。

三、异同点

相同点

都起到了连接与保护的作用,正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。

都能提高访问速度。

不同点

正向代理是用户客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁;

正向代理架设在客户机和目标主机之间,反向代理架设在网络服务器端;

正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。

数据层次

  • sql的优化,多次查询的尽量用一句sql来执行
  • 索引优化。表过大,重要搜索字段一定要加上索引,多字段要遵循最左原则
  • 数据库引擎:对于非重要数据表可以使用myisam数据表,而非innerdb
  • 反三范式设计,减少数据表的查询
  • 如果数据量确实过大,需要根据适当的算法考虑分表
  • 配置数据库的主从复制,读写分离。

代码层次

  • include_once比include更加耗时
  • 变量拼接比直接使用双引号快
  • 公共变量的定义如果变量值不变化,不要写再循环内
  • 静态函数要比成员函数快(不用new了,直接使用)
  • 如果处理的文案过大,正则会很影响行性能;
  • 尽量不要使用相对路径来包含文件,因为会基于当前目录去查找;
  • ===要快于==
  • && 要比and快,并且更不容易出问题(&& 运算级别高于and),类推。
  • 后端缓存
  • 对于常用数据,要用缓存存储。可以使用redis等,但是也要考虑内存的大小。具体取舍看具体项目
  • 前端
  • 服务器缓存:pagecache,
  • 客户端:基本常用数据存储到cookie,localstorage等不需要不同页面都要获取接口数据,对接口造成压力
  • 服务器层次
  • 硬件配置
  • 服务器尽量购买使用地区最近的服务器
  • 负载均衡,让多个服务器来分解压力