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

问题描述 投票:0回答:1

我当前正在运行不同的查询,我想排除那些过去 36 小时内不活跃的用户。

我的用户表有一个

last_connection_time
,它是用户上次连接时间的时间戳。

我正在考虑在相关查询中添加

users.last_connection_time < $timestamp_36hours_ago

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

是否最好每 2 - 6 小时运行一个脚本来更新用户表中名为

inactive
的布尔列,然后通过
whereNull('users.inactive')
忽略查询中的那些不活动用户?

mysql laravel query-optimization sql-timestamp
1个回答
2
投票

索引

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

但是,如果你创建一个布尔列,然后基于

whereNull(users.inactive)
执行查询 -> 索引无法帮助你,它是一个低基数列,MySQL 可能会忽略这里的索引,因为它无助于减少 I/O ,从而检查整个数据集 - 这就是您想要避免的。

您的数据集可能不会超过太字节限制(甚至千兆字节),因此您当前可能不会看到两种方法之间有太多差异,但对于不断增长的数据集,我只需保留时间戳列索引并执行

>
<
类型的查询,就像您在第一个场景中想做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.