我有两张桌子
- 朗文章 | 列:id (INT) ,de (VARCHAR),en (VARCHAR),count_links(INT)
- 维基链接 | 列:article_id、link_id、nr_in_article(所有整数)
文章名称位于 de(德语)和 en(英语)列中。LangArticles 表中的 id 与 ids article_id 和 link_id 相同。
我现在想获取链接到另一篇文章的所有文章名称。所以我想要所有链接到“abc”的文章。'abc' 的 id = '1'
所以我的正常查询(没有排序)看起来像:
select distinct(LA.de),W.nr_in_article,LA.count_links from
LangArticles as LA inner join WikiLinks as W on W.article_id = LA.id
where W.link_id in ("1")
这可能需要 0.001 秒并给我 100000 个结果。实际上,我想要最好的 5 次点击。在这种情况下,最好的意思是最相关的。我想这样排序:在文章开头(nr_in_article)链接到'abc'并且本身有很多链接(count_links)的文章应该有很高的排名。
我正在使用
order by (1-(W.nr_in_article/LA.count_links)) desc
为了这。
问题是我不确定如何优化这个订单。
mysql中的解释说他必须使用临时文件和文件排序,并且不能通过键使用顺序上的索引。为了进行测试,我尝试了 W.nr_in_article 的“简单”订单,因此是一键正常订单。
供您参考,我的指数是:
在 LangArticles 中:id(主要),de(唯一),en(唯一),count_links(索引)
在 WikiLinks 中:article_id(index),link_id(index),nr_in_article(index)
但是我也尝试了这两个多索引 link_id,nr_in_article & article_id,nr_in_article。
使用 order by 的查询大约需要 5.5 秒。:(
我想我知道为什么 MySql 必须在这里使用临时文件和文件排序,因为必须使用一个索引(link_id)找到所有 100,000 个条目,然后必须对其进行排序,并且在临时文件中它不能使用索引。
但是有什么方法可以让这更快吗?实际上我只想要最好的 5 个命中,所以没有必要对所有内容进行排序。我不确定是否…… 像坏排序(冒泡排序)这样的排序比对空洞临时表进行排序的快速排序更快。