优化方法:客户搜索的时候,如果检查到客户搜索的关键字为中文,则不再
like 匹配拼音字段、手机号字段。
效果:原来几秒甚至十几二十秒的请求 => 2s 内可以完成。
场景:不必要的 order by
还是搜索,在列表搜索的时候,有些地方的搜索很多时候搜索结果只有 1
条,又或者几条,反正几乎 100% 的情况不会超过 50 条。但是尽管如此,MySQL
语句里面还是有 order by 子句。而这个 order by
是有点多余的,甚至会对性能造成很严重的影响。比如,只有一条搜索结果数据的情况下,order by
的开销完全是多余的。
优化方法:如果判断关键字长度达到一定长度,基本上能搜索出来的结果只有那么一两条了,这个时候直接去除
order by,然后获取到查询结果后再在代码里面做排序(就是对搜索的结果做排序,但实际上很多情况下都是没有必要的,因为只有一条数据)。
效果:原来十几二十秒的请求 => 1s 内可以完成。
场景:order by id
在有些 sql 中,往往会需要根据 id
做逆序查询,但是如果我们的语句中有几个条件的话,只
order by id 会很慢,但是如果我们有另外的 where
字段,可以考虑将 id 和 where 的字段做一个联合索引,然后
order by 这个索引中的字段,这样一来 MySQL
排序就可以直接用索引的排序的。
效果:几秒的查询 => 几百毫秒
其他:查询尽量覆盖索引
我们在做过滤的时候,如果 where
条件的时候有某些字段不存在索引里面的话,会需要进行回表,数据量大的时候效率很低。
这个时候绝大多数人的请求影响不会很大,但是还有一个人,那就是等待 C
接口返回的人。他也等不及了,然后又发起了一次新的请求,这下好了,大家的等待时间要
+18s 了。em... 那就大家一起等 36s 吧,停下来喝杯茶就好了。但是等待 C
接口返回的人发起的这个新的请求又等了好久,实在是忍不住了,再动起了鼠标,再发了几次请求。
em... 这下可好了,完完全全 “宕机”
了,救火的人出现了。拿起键盘一把梭,重启服务器的 php
进程,重启之后,发起 C
接口请求的人正在喝茶,这个时候其他人的请求得以正常处理了一会,让大家稍微喘了口气。
“宕机” 是如何恢复的
但是好景不长,那个等待 C
接口返回的人,杯里的茶喝完了,回到浏览器看了一眼,但是发现服务器返回了错误。这下彻底坐不住了,键盘一摔,拿起鼠标又继续之前的操作,又来了几次
C 接口请求,然后服务器又开始
“宕机”,再次重启。如此来回几次之后,那个人最后发现自己的请求终于生效了,也就不再发起新的请求了。
至此,“宕机” 得以暂时的恢复了。直到下一个请求 C 接口的人出现...
解决问题
打开问题代码所在源文件之后,删除了一些几年前写的不再使用的代码之后。发现上面的
B 函数也是不再需要的了,也就是说 A 和 B 函数都是不再需要的了。
所以,解决问题的方法极其简单,将 B
函数的调用去掉就解决了。有点难以置信困扰这么久的就这么简单的被解决了,之前一度以为要做很多很多优化才能不会再出现类似的
“宕机” 的问题,但现在看来似乎并不是这样。
PSH(push) flag indicates that the incoming data should be passed on
directly to the application instead of getting buffered.
ACK(acknowledgment) flag is used to confirm that the data packets
have been received, also used to confirm the initiation request and tear
down requests. Once a TCP session has been created, every packet
contains an ACK flag.