2012-10-25 17 views
2

域我有url_stackurliddomainiddomain_stackdomainiddomain_countSQL:選擇5個網址,其中至少走訪儘可能快

url_stack具有urlid作爲其主鍵和BTREE索引domainiddomain_stack具有domainid作爲其主要和BTREE索引domain_count

我不斷地將網址添加到堆棧。當從堆棧中彈出url時,我將1添加到它的domain_count

當我彈出一個url時,我保持它的域的數量,這就是爲什麼有很多域沒有任何url(這就是爲什麼@moj回答有問題)。

當彈出我想選擇爲每個可用domain_countsurl和限制自己的前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

你能解釋一下利用集團的' '?或者這是一個錯字?你有沒有嘗試'ORDER BY domain_stack.domain_count ASC LIMIT 5;'爲你的最後一行? – ace

+0

@ace可能會有很多網址與'domain_count' 1,如果我使用'ORDER BY'我會得到5個網址'domain_count = 1',但我想要每個domain_count類別之一,我希望這可以解釋它.. – zenpoy

+0

啊。所以如果我有5個網址與'domain_count = 1',你只能得到1個網址,並且無論你得到哪一個? – ace

回答

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 Fiddle Demo

+0

這看起來不錯,但是因爲實際上'domain_stack'中的域沒有引用它們的url,所以你寫的查詢返回空集... – zenpoy

+0

我不確定我是否理解了語義您的數據模型正確。 如果您擴展您的示例,這可能會有所幫助,以便您描述的問題變得可見。 內部查詢的以下選擇如何: _where domain_count> 0_ – moj

相關問題