Laravel - MySQL - 时间戳性能与布尔列?

Laravel - MySQL - Timestamp performance vs boolean column?

我目前运行正在处理不同的查询,我想排除那些在过去 36 小时内没有活动的用户。

我的用户 table 有一个 last_connection_time,这是用户上次连接的时间戳。

我正在考虑在相关查询中添加 users.last_connection_time < $timestamp_36hours_ago

我有点担心这会对性能产生多大影响。

每 2-6 小时 运行 一个脚本来更新用户 table 中名为 innactive 的布尔列,然后简单地忽略那些不活跃的用户会更好吗?通过 whereNull('users.innactive')?

查询

索引 last_connection_time 然后执行大于/小于比较将足够快并且将使用索引,这将在查找记录时极大地帮助 MySQL。

但是,如果您创建一个布尔列,然后根据 whereNull(users.inactive) 执行查询 -> 索引无法帮助您,这是一个低基数列,MySQL 可能会忽略此处的索引,因为它无助于减少 I/O,从而检查整个数据集 - 而这正是您要避免的。

你的数据集可能不会超过 TB 限制(甚至 1 GB),所以你目前可能不会看到两种方法之间有太多差异,但对于不断增长的数据集,我会简单地保留timestamp 列索引并执行 >< 类型的查询,就像您在第一个场景中想做的那样。