我试图理解为什么当数据库具有高写入负载时更新语句不会导致历史列表长度(HLL)增长。但 Select 语句会导致 HLL 在相同的情况下增长。
场景 1:HLL 没有增长
- MySQL DB 有 1 个表,2 列(1 个主键)
- 使用 sysbench 使用 8 个线程运行更新和插入语句到该表中
- 在 sysbench 加载的同时,有一个长时间运行的事务:
> START TRANSACTION;
> UPDATE t1 SET c2 = 'val' WHERE c1 != 'DONE'.
[leaving this terminal open without committing]
场景 2:HLL 正在增长(如预期)
- 设置与上面相同:1 个表和 sysbench 针对该表运行写入语句。
- 与 sysbench 加载同时,长时间运行的事务只是一个 SELECT 语句:
> START TRANSACTION;
> SELECT * from t1 WHERE c1 != 'DONE'.
[leaving this terminal open without committing]
预期:HLL 在这两种情况下都应该快速增长,因为这两种情况都应该使用读取视图。
实际观察:HLL 仅在场景 2 中快速增长。对于场景 1,HLL 几乎保持不变。
问题: 为什么会出现这种行为?为什么带有 where 条件的更新语句不会导致 HLL 增长?