我有带url_stackurliddomainid表和带domain_stackdomainiddomain_count表。
url_stackurlid为主键,在BTREE上有一个domainid索引。domain_stackdomainid为主,在BTREE上有一个domain_count索引。
我经常在堆栈中添加url。当从堆栈弹出一个url时,我将1添加到它的domain_count中。
当我弹出一个url时,我会保留其域的计数,这就是为什么有许多域没有任何url(这就是为什么@moj answer是错误的)。
弹出时,我想为每个可用的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

最佳答案

尝试此操作(加入前域计数的组值):

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

10-05 19:31