我有url_stack
表格urlid
和domainid
以及domain_stack
表格domainid
和domain_count
。
url_stack
以urlid
为主键,BTREE
为domainid
索引。 domain_stack
在domainid
上有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
答案 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