接触到一个网站,静态资源和接口都在同一台服务器,静态资源加载很快,都是几十上百毫秒就可以加载,但是接口请求都很慢,平均有6-7秒。
先查看了接口请求日志,发现每个接口的执行时间确实都很长,查看接口代码,代码不多而且都是简单的查询,代码应该没什么问题。
查看了MySQL慢日志,里面没有慢SQL的记录,又利用框架记录SQL的执行时间,执行都很快,基本是10毫秒以内的级别。
这就奇怪了,怎么会这样?
最后还是看框架与MySQL交互相关的日志,发现 connect time 比较大,每次都要1秒多,原来是连接慢,但是MySQL就在本机,怎么会连接这么慢呢?
看了一些连接MySQL的配置,主机地址是 localhost 再考虑到题目说的Windows系统,考虑会不会是 localhost的问题?于是改成127.0.0.1试一下,果然接口执行速度马上就上来了,connect time 由 1秒多变成了几毫秒,整个接口执行速度平均到了500毫秒以内。
总结一下,这里是由于Windows系统把localhost解析到了IPV6地址[::1]去了,所以在连接的时候,先连接IPV6的地址,连不上再连IPV4地址,而我们的软件配置都是监听的IPV4的地址的。
所以实际这里的解决办法有两个:
1、把localhost指向IPV4地址,即在hosts里面配置 127.0.0.1 localhost
2、连接MySQL的时候配置地址为127.0.0.1而不是localhost
PS:
在Linux环境中,localhost与127.0.0.1对数据库的影响几乎没有区别,但是据网友所说127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。也有网友说两者都不经过网卡,我比较信任第二种。localhost不受限制,在消耗网络资源的服务器中,使用localhost更加恰当!
在本地环境中,建议使用127.0.0.1的方式连接数据库,可以大幅度提升速度,本地体验极佳!
再PS:
前面说到接口执行速度平均到了500毫秒感觉还是有点慢,再次检查了一下日志,发现每个接口请求都会执行相同的几个查询,这就有问题了,每次请求都查询的数据为什么不缓存下来呢?于是加上了缓存,接口请求速度又快了几倍,达到200毫秒以内了。