Laravel - MySQL - 时间戳性能与布尔列?
Posted
技术标签:
【中文标题】Laravel - MySQL - 时间戳性能与布尔列?【英文标题】:Laravel - MySQL - Timestamp performance vs boolean column? 【发布时间】:2019-12-28 12:46:01 【问题描述】:我目前正在运行不同的查询,我想排除过去 36 小时内未活动的用户。
我的 users 表有一个 last_connection_time
,这是用户最后一次连接的时间戳。
我正在考虑在相关查询中添加users.last_connection_time < $timestamp_36hours_ago
。
我有点担心这会对性能产生多大影响。
最好每 2 到 6 小时运行一次脚本,更新用户表中名为 innactive
的布尔列,然后通过 whereNull('users.innactive')
忽略查询中的那些非活跃用户?
【问题讨论】:
我们需要查看查询的其余部分。 【参考方案1】:索引last_connection_time
,然后执行大于/小于比较将足够快,并且将使用索引,这将极大地帮助 mysql 查找记录。
但是,如果您创建一个布尔列,然后基于 whereNull(users.inactive)
执行查询 -> 索引无法帮助您,它是一个低基数列,MySQL 可能会忽略此处的索引,因为它无助于减少 I /O,从而检查整个数据集 - 这就是您要避免的。
您的数据集可能不会超过 TB 限制(甚至 1 GB),因此目前您可能不会看到两种方法之间有太多差异,但对于不断增长的数据集,我只需保留时间戳列索引并执行 >
或 <
类型的查询,就像您在第一个场景中想要执行的那样。
【讨论】:
非常感谢!所以我基本上应该在 last_connection_time 中添加一个索引标志并使用它 @InigoEC - 完全正确。以上是关于Laravel - MySQL - 时间戳性能与布尔列?的主要内容,如果未能解决你的问题,请参考以下文章
导入 csv excel 文件时,Laravel 7 时间戳迁移始终返回 0000-00-00 00:00:00
在 Valetina studio 中获取 mysql 中的当前时间戳