2

とのurl_stackテーブルurliddomainidと のdomain_stackテーブルがdomainidありdomain_countます。

url_stackurlid主キーとして にBTREEインデックスを持っていdomainidます。domain_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 に答える