SQL:选择5个URL,尽可能快地访问最少的域

时间:2012-10-25 15:25:24

标签: mysql sql

我有url_stack表格urliddomainid以及domain_stack表格domainiddomain_count

url_stackurlid为主键,BTREEdomainid索引。 domain_stackdomainid上有BTREE作为主要内容和domain_count索引。

我经常将网址添加到堆栈中。从堆栈中弹出网址时,我会将1添加到其domain_count

当我弹出一个网址时,我保留了其域名的数量,这就是为什么有很多域名没有任何网址(这就是@moj回答错误的原因)。

弹出广告时,我想为每个可用的url选择一个domain_counts,并将自己限制在前5位。

例如,一个常见的结果是:

+------------+------------+--------------+
| urlid      | domainid   | domain_count |
+------------+------------+--------------+
|  852336945 | -184315873 |            1 |
| 1930023009 |  -43391685 |            2 |
| -112137768 | 1607144692 |            4 |
| 1673460622 |  567460239 |            8 |
|  612511843 | 1444323871 |           11 |
+------------+------------+--------------+  
5 rows in set (5.37 sec)

通过调用:

SELECT urlid,domain_stack.domainid,domain_stack.domain_count
FROM  domain_stack
INNER JOIN url_stack
ON url_stack.domainid = domain_stack.domainid
GROUP BY domain_stack.domain_count LIMIT 5;

问题是这太慢了 - 每次查询我不得不低于0.5秒。我应该如何更改查询/我的表格以使其更快?

编辑:这是一个描述情况的链接http://sqlfiddle.com/#!2/70ded/1/0

1 个答案:

答案 0 :(得分:1)

尝试此操作(加入前domain_count的组值):

select 
    us.*, -- random row from group is ok
    top5.domain_count 
from 
    url_stack us
    inner join 
         (  
           select 
               domainid, -- random domain id from group is ok
               domain_count
           from 
               domain_stack
           group by 
               domain_count asc
           limit 5 -- all domains must have a counter > 0
         ) top5
         on top5.domainid = us.domainid
group by
    top5.domain_count asc
limit 5

SQL Fiddle Demo