有关如何优化以下查询的任何想法:
SELECT ip FROM clicks
WHERE ip = ?
AND SECOND(date_clicked)+4 > SECOND(NOW())
AND MINUTE(date_clicked) = MINUTE(NOW())
AND HOUR(date_clicked) = HOUR(NOW())
AND DATE(date_clicked) = DATE(NOW())
我的意思是,如果可能的话,减少日期/时间检查的数量会很棒。该查询的主要目标是查看 4 秒内是否确实发生了来自特定 IP 的点击。
干杯, /马辛
最佳答案
您只需调用 DATE_ADD()
一次即可,测试 date_clicked
中存储的日期加上 4 秒是否大于当前时间戳 (NOW())
。
SELECT
ip
FROM clicks
WHERE ip = ?
AND DATE_ADD(date_clicked, INTERVAL 4 SECOND) > NOW()
更新
我想补充一点,在实践中这不会很好地工作。许多用户共享 IP 地址。在此系统下,学校或网络中同一 NAT 地址的两个用户将无法在 4 秒内互相点击。最好存储一些用户识别值,例如 session cookie 或用户 ID 中的 token ,而不是存储 IP 并根据 IP 地址设置超时。
关于MySQL 日期查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964576/