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 列索引并执行 >
或 <
类型的查询,就像您在第一个场景中想做的那样。
我目前运行正在处理不同的查询,我想排除那些在过去 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 列索引并执行 >
或 <
类型的查询,就像您在第一个场景中想做的那样。