0

我所拥有的是一个表 statistieken,其中包含一个 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 秒,在我看来这应该是可能的......

4

3 回答 3

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
  • urls加快ORDER BY
于 2012-08-03T11:55:05.253 回答
0

派生表INNER JOIN比子查询快。试试这个优化的查询:

SELECT *
FROM statsitieken a
    INNER JOIN (SELECT hash
                FROM statsitieken
                WHERE lastvisit > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )
                ) b
        ON a.hash = b.hash
GROUP BY a.hash
HAVING COUNT(urls) > 25
ORDER BY urls;

为了更好地执行此选择查询,您应该将索引添加为:

ALTER TABLE statsitieken ADD KEY ix_hash(hash);

ALTER TABLE statsitieken ADD KEY ix_lastvisit(lastvisit);
于 2012-08-03T11:55:20.223 回答
0
WHERE hash in (SELECT hash FROM `database`.`statsitieken`
where `lastvisit` > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )
                            )

你在同一个表中“子查询”(我不知道是否存在那个词:P,'做一个子查询'),为什么不:

where `lastvisit` > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )

直接做吗?

于 2012-08-03T11:56:17.110 回答