mysql - 如何格式化这个 mysql 查询

标签 mysql select where-clause

我拥有的是一个统计表,其中包含 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 BYWHERE
  • url 加快 ORDER BY

关于mysql - 如何格式化这个 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795173/

相关文章:

mysql - select inside insert 语句和过程

.net - "Or"等价于 LinqWhere() lambda 表达式

mysql - 使用 Join with Where

php - Laravel 在关系对象上的位置

php - 从 XAMPP 迁移到 LAMP 时出现问题。内存限制错误

php - Opencart 2.3.0.2 : additional column in product list using multi user extension

php - 根据另一个表中的关联字符串查询和排序以分号分隔的 id 列表的最有效方法是什么?

php - 从 MySQL 数据库填充 PHP 下拉列表

python - 在Python中使用pandas数据框选择带有 bool 数组的行

mysql - 如何创建一个 SQL 选择,为一个范围创建所有数据并计算出现次数