Mysql 按订单查询优化
我有两张桌子Mysql 按订单查询优化,mysql,sql,sorting,indexing,Mysql,Sql,Sorting,Indexing,我有两张桌子 LangArticles |列:id(INT)、de(VARCHAR)、en(VARCHAR)、count_links(INT) WikiLinks |列:文章id、链接id、文章中的nr(所有整数) 文章的名称在de(德语)和en(英语)列中。 LangArticles表中的id与ids article\u id和link\u id相同 我现在想得到所有链接到另一篇文章的文章名。所以我想要所有链接到abc的文章abc'的id为'1' 因此,我的常规查询(没有order by)如下
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支安打。
在这种情况下,最好的方法是最相关的方法。我想这样分类:
在文章开头链接到“abc”的文章(nr_in_文章)本身有很多链接(count_链接)应该有较高的排名
我正在使用
order by (1-(W.nr_in_article/LA.count_links)) desc
为了这个
问题是,我不知道如何优化这个订单
mysql中的解释说,他必须使用临时文件和文件排序,不能使用ORDERBY键上的索引。为了进行测试,我在文章中尝试了W.nr_的“简单”顺序,这样就可以用一个键实现正常顺序
供您参考,我的索引如下:
在LangArticles中:id(主要)、de(唯一)、en(唯一)、count_链接(索引)
在维基链接中:文章id(索引)、链接id(索引)、文章中的nr(索引)
但我尝试了这两个多索引链接&article\u-id,nr\u-in\u-article,nr\u-in\u-article
按tooks排序的查询大约需要5.5秒:(
我想我知道为什么MySql必须在这里使用临时文件和文件排序,因为所有100000个条目都必须用一个索引(link_id)找到,然后必须对其进行排序,在临时文件中不能使用索引
但是有没有办法让这更快?
事实上,我只想要最好的5次点击,因此没有必要对所有内容进行排序。我不确定像坏排序(气泡排序)这样的排序是否比对孔临时表进行排序的快速排序更快。由于您只需要前5次点击,我想您可以将其分成两个查询,结果应该会更少 首先,正如山姆指出的
order by (W.nr_in_article/LA.count_links) asc
应该相当于你的
order by (1-(W.nr_in_article/LA.count_links)) desc
除非我忽略了某个角落的案子
此外,任何
W.nr_in_article > LA.count_links
将位于前5名,除非结果为空,所以我将尝试查询
select distinct(LA.de),W.nr_in_article,LA.count_links
from LangArticles as LA
inner join WikiLinks_2 as W on W.article_id = LA.id
and W.nr_in_article > LA.count_links
where W.link_id in ("1")
order by W.nr_in_article/La.count_links
limit 5
只有当返回的结果少于5个时,才需要使用已更改的where条件再次执行查询
不过,这不会使运行时降低几个数量级,但应该会有一点帮助。如果您需要更高的性能,我认为除了物化视图之外没有其他方法,我认为物化视图在mysql中不可用,但可以使用触发器进行模拟。因此,由于您只需要前五个,所以在查询的末尾添加了“LIMIT 5”,right?不确定mysql会更快,但你至少应该试试。顺便说一句,我从来没有在一列上看到像在distinct(LA.de)中那样的distinct?这是怎么回事!?像group by一样!?我试图设置一个限制5,但我发现它不会更快,所以我认为mysql使用了完整的排序(快速排序)好的,这正是我所期望的。它很可能不是快速排序,而是mergesort(仅供参考,与当前问题无关)。我试过这样做,但我想表明相关性更高,所以我使用了1-variant。MySQL视图实际上与子查询的联接是等效的。最近在MySQL 5.5上证实了这一点,因此除了可读性之外,它们不会有任何区别。是的,这就是我谈论物化视图的原因。这些表是基于一个可以索引的视图,因此order by可以使用索引,速度可以快几个数量级。我确实理解你的意思,只是想添加我的发现(“事实上”->“的确”,我也是瑞士人:))。