MySQL 日期查询优化

标签 mysql query-optimization

有关如何优化以下查询的任何想法:

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/

相关文章:

php - 优化集合包含查询

php - 第一个具有多个 where 子句的左连接(左表)

mysql - 如何将 *sorted* SELECT 结果存储在另一个表中?

MySQL 统计 10 万条记录条件需要 6 秒

performance - MongoDB 索引定义策略

mysql - CodeIgniter 中带有多个条件的 SQL INNER JOIN

mysql - 令人难以置信的慢 GitLab 与 MySQL

SQL,选择至少匹配 N 列的行对

MYSQL查询、优化

mysql - 优化此 MySQL 查询,删除另一个表中缺少的行