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

Laravel,Mysql重复条目

laravel 监听mysql操作 生成时间

在 Valetina studio 中获取 mysql 中的当前时间戳

Laravel 5 自定义验证 - 自定义 MySQL 查询

使用 touch() 更新 laravel 中自定义时间戳字段的时间戳