Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按订单查询优化_Mysql_Sql_Sorting_Indexing - Fatal编程技术网

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)如下

我有两张桌子

  • 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可以使用索引,速度可以快几个数量级。我确实理解你的意思,只是想添加我的发现(“事实上”->“的确”,我也是瑞士人:))。