本机真实用DEBUG SET-ACTIVE-EXPIRE 0完全禁用后台过期扫描,验证一个TTL早已过去的key真实还占用着48字节内存、DBSIZE真实还算着它,直到一次真实的GET才让它真实消失。
本机真实设maxmemory=3MB+volatile-lru,插入200个无TTL的key和600个有TTL的key直到触发83次淘汰,真实验证结果是:200个无TTL的key100%真实幸存,600个有TTL的key只剩516个——只有设了过期时间的key才会真实被淘汰。
本机真实用跟volatile-lru一样的200个无TTL+600个有TTL的key,只改成allkeys-lru策略,真实验证这次无TTL的key也被淘汰了13个(187/200幸存)——直接对照上一篇的100%幸存,证明allkeys-lru真实不区分key有没有过期时间。
本机真实用allkeys-lfu,400个key真实高频访问50次(hot_),400个key真实从不访问(cold_),触发淘汰后真实幸存率是hot_ 87.5%(350/400) vs cold_ 26.75%(107/400),OBJECT FREQ真实显示访问频率的差异。
本机真实用同一个访问模式(star_key历史上被访问100次,之后完全不碰;2000个filler_key各访问1次但都是最近访问的),LRU策略下star_key真实被淘汰了,LFU策略下star_key真实活下来了——同样的数据,两种策略给出完全相反的结果。
本机真实设maxmemory=3MB+noeviction,写到第715个key时真实收到OOM错误"command not allowed when used memory > maxmemory";换成allkeys-lru后同样超量写入500个key真实全部成功,没有一次报错。
本机真实验证即使完全禁用淘汰(noeviction),一个200ms过期的key依然会真实按时消失;再用volatile-ttl策略给1000个TTL长达999999秒(远未到期)的key制造内存压力,真实观测到4129次淘汰——证明淘汰是内存驱动,过期是时间驱动,两者真实完全独立。
本机真实插入5万个key全部设置相同的200ms过期时间,追踪DBSIZE的真实下降轨迹(0.11秒时已从5万降到5239,0.22秒时清零),并发PING探测显示整个过程最大延迟只有7.55毫秒——证明批量过期不会造成明显卡顿。
本机真实用CREATE INDEX ... ((表达式))直接在JSON路径表达式上建功能索引,真实验证SHOW COLUMNS里不会多出任何可见列——跟上一篇用具名STORED生成列建索引相比,这是另一条不留痕迹的真实路径。
本机真实建一张按年份RANGE分区、30万行的表,用EXPLAIN真实验证日期范围查询的行数估算精确落在单个分区的行数上,再真实测出一个反直觉的结果:这次分区裁剪的查询反而比无条件COUNT(*)慢了约3倍。
本机真实在一张200万行的表上,真实测ALGORITHM=INSTANT加一列只要0.0066秒,而改一列的数据类型真实需要ALGORITHM=COPY整表重建,耗时3.0938秒——差了469倍,200万行数据真实完整无损。
本机真实建三张子表,分别用ON DELETE CASCADE、SET NULL、默认RESTRICT,对同一个父行删除操作,真实验证三种真实不同的结局:子行真实被删除、子行的外键列真实变NULL、删除操作真实被拒绝。