我拥有的是一个统计表,其中包含 IP、浏览器信息的哈希值、访问的 URL 以及上次访问的时间戳日期。
我可以从不同的来源编译得到这个查询,唯一的问题是这个查询需要永远(9分钟)才能在大约15000行的表上完成,所以这个查询效率非常低。
我想我会以错误的方式解决这个问题,但我找不到合适的帖子或教程如何使用选择的结果作为获得我想要的结果的基础。
我只想概述表中与过去 12 小时内访问超过 25 个页面的返回结果的哈希值相匹配的每个条目。
CREATE TABLE IF NOT EXISTS `statsitieken` (
`hash` varchar(35) NOT NULL,
`ip` varchar(24) NOT NULL,
`visits` int(11) NOT NULL,
`lastvisit` int(11) NOT NULL,
`browserinfo` text NOT NULL,
`urls` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这是我迄今为止尝试编译的查询。
SELECT * FROM `database`.`statsitieken` WHERE hash in (SELECT hash FROM `database`.`statsitieken`
where `lastvisit` > unix_timestamp(DATE_SUB(
NOW(),INTERVAL 12 hour
)
)
group by hash
having count(urls) > 25
order by urls)
我需要在适当的时间内编译它,比如 <1 秒,在我看来这应该是可能的......
最佳答案
我建议尝试这个修改后的查询。子查询现在仅计算一次,而不是针对返回的每个记录运行:
SELECT s.*
FROM `database`.`statsitieken` s, (SELECT *
FROM `database`.`statsitieken`
WHERE `lastvisit` > UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 12 HOUR))
GROUP BY hash
HAVING COUNT(urls)>25) tmp
WHERE s.`hash`=tmp.`hash`
ORDER BY s.urls
确保您在以下字段上有索引:
hash
加速GROUP BY
和WHERE
url
加快ORDER BY
关于mysql - 如何格式化这个 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795173/