我有带url_stack
和urlid
的domainid
表和带domain_stack
和domainid
的domain_count
表。url_stack
以urlid
为主键,在BTREE
上有一个domainid
索引。domain_stack
以domainid
为主,在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