2

我有url_stack一张桌子urliddomainid一张domain_stack桌子domainid和一张桌子domain_count

url_stackurlid作为它的主键和一个BTREE索引domainiddomain_stackdomainid作为它的主要和一个BTREE索引domain_count

我不断地将 url 添加到堆栈中。当从堆栈中弹出一个 url 时,我添加1到它的domain_count.

当我弹出一个 url 时,我会保留它的域的计数,这就是为什么有很多域没有任何 url(这就是为什么@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

4

1 回答 1

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 小提琴演示

于 2012-10-25T21:00:01.473 回答