2012-08-03 131 views
0

我所知道的是一个表格statistieken与一个IP,浏览器信息的散列,访问的网址和最后访问日期的时间戳。如何格式化这个mysql查询

我可以从不同的来源编译导致这个查询,唯一的问题是这个查询需要永久(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秒这应该是在我看来,可能的...

回答

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
+0

那个问题是我没有得到这个人访问过的个人网址 – Tschallacka 2012-08-03 11:58:12

+0

我没有理解任何东西。我刚刚更新了我的查询。 – Jocelyn 2012-08-03 12:02:02

+0

谢谢。现在我明白为什么这个工作,而我没有。谢谢你的启发! – Tschallacka 2012-08-03 12:06:07

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); 
+0

它给en错误'#1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第8行'b ON a.hash = b.hash GROUP BY a.hash HAVING COUNT(urls)'附近使用正确的语法。此外,这会将散列一起挤压并且我仍然没有得到该人访问过的个人网址 – Tschallacka 2012-08-03 12:02:23

0
WHERE hash in (SELECT hash FROM `database`.`statsitieken` 
where `lastvisit` > unix_timestamp(DATE_SUB(
            NOW(),INTERVAL 12 hour 
            ) 
          ) 

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

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

直接做?

+0

因为我想用它做具体的事情。如果我把它全部放在一个查询中,它会被团队和东西压垮。所以首先我需要得到所有符合我的参数的哈希值,然后我可以获取我需要的具有这些哈希值的信息。 – Tschallacka 2012-08-03 11:57:43

+0

ahhh好,不反对那么:P – 2012-08-03 12:19:52