我有 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 的回答是错误的)。
弹出时我想选择一个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
最佳答案
试试这个(加入前对 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
关于mysql - SQL:选择 5 个 url,尽可能快地访问最少的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071948/