mysql - SQL:选择 5 个 url,尽可能快地访问最少的域

标签 mysql sql

我有 url_stackurliddomainid和一个 domain_stackdomainiddomain_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

最佳答案

试试这个(加入前对 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

关于mysql - SQL:选择 5 个 url,尽可能快地访问最少的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071948/

相关文章:

MySQL LOAD DATA LOCAL INFILE 客户端中的差异

sql - 从 SQL 中的序列中获取最后一个值并将其插入到另一个表中 (Oracle)

php - 通过$_FILES变量可以实现SQL注入(inject)吗?

java - 打开报告(oreports) MYSQL JDBC 连接

c# - 尝试插入日期时间时 MySQL 出错

mysql - Sequelize 连接表不返回附加字段

php - 为动态数据库创建更新查询

MySQL:WHERE IN 列表的限制结果

mysql - 如果没有帖子,在查询结果中显示用户?

c# - 将图像上传到新数据库而不是使用应用程序的数据库