✅Redis和MySQL的一次普通查询,RT在什么范围内是合理的?

✅Redis和MySQL的一次普通查询,RT在什么范围内是合理的?

典型回答

Redis是基于内存的,MySQL是基于磁盘的(非Memory引擎),所以Redis要比MySQL快,一次RT要分两部分,一部分是网络交互的耗时,一部分是命令(SQL)执行的耗时。但是不管怎么说,Redis都要比MySQL快得多。

先说下纯命令(SQL)执行耗时情况。

Redis命令执行耗时

Redis的简单命令(如<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">GET</font><font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">SET</font>)执行耗时大概在0.1ms~1ms(100-1000微秒)。复杂命令(如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ZADD</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">HSET</font>**)的执行耗时大概在1ms~5ms左右。

下图是阿里云给出的Redis和云上服务的对比图,可以看到,Redis的P99基本都在1毫秒以内的。(测试环境:标准架构(双副本),不启用集群, 8 GB)

测评地址:https://help.aliyun.com/zh/redis/support/performance-whitepaper-of-community-edition-instances

MySQL的SQL运行耗时

首先,对于MySQL来说,命中索引、命中buffer pool,无join等等都对性能有很大的影响。但是还是能给出一些大致的范围的。

如果一个查询,直接命中buffer pool并且通过主键查询,那么可能在2ms以内也能返回。比Redis慢不了多少。

如果没有命中buffer pool,就需要去磁盘读取,这时候就需要更多的耗时了,一般我们认为一次查询如果超过1秒钟算是慢SQL了,所以,一个正常的查询语句,应该在1000ms内返回,我们普遍认为200ms-500ms以内算是比较好的一个性能了。

以上说的不包括任何的网络交互的时长,还要再加上网络耗时,那么网络耗时怎么算的呢?

网络耗时

一次HTTP交互过程包括DNS解析、TCP握手、LS握手、HTTP请求、HTTP响应几个步骤了。那么一次请求(非HTTP 3.0的情况)就是:

DNS解析(5ms~300ms)  
  → TCP握手(1.5×RTT)  
  → TLS握手(1×RTT)  
  → HTTP请求/响应(1×RTT)  
总耗时 = DNS + 3.5×RTT  

大概3.5个RTT加上DNS解析的耗时了。

✅HTTP/2存在什么问题,为什么需要HTTP/3?

RTT是什么呢?就是一次请求的往返时间,那么这个又咋算呢,可以给个大概的参考:

二、典型场景下的网络耗时

1. 局域网(LAN)

场景 平均RTT
千兆以太网(同交换机) 0.1ms~0.5ms
WiFi 6(近距离) 1ms~5ms
企业内网跨机房 1ms~2ms

2. 广域网(WAN)

场景 平均RTT
同城数据中心(≤100km) 1ms~5ms
跨省(如北京→上海) 20ms~30ms
跨国(如中国→美西) 100ms~150ms
卫星通信(如Starlink) 20ms~50ms

3. 移动网络

场景 平均RTT
4G LTE 30ms~100ms
5G SA(Sub-6GHz) 10ms~30ms
5G毫米波(mmWave) 1ms~10ms