Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 SQL查询非常慢_Mysql_Search_Many To Many_Query Optimization - Fatal编程技术网

Mysql SQL查询非常慢

Mysql SQL查询非常慢,mysql,search,many-to-many,query-optimization,Mysql,Search,Many To Many,Query Optimization,我有这个模式,这将坐在一个爬虫的后面mitza.mine.nu 我不擅长SQL,并且我遇到了接近的结果。但问题是 快到尽头了。因为2个单词几乎需要一分钟,而3个单词永远需要 在4555条记录上。(当前生命样本运行另一个查询) que做到了这一点: 搜索w1 w2中的单词点击DICT并获取单词id。这是在一个单独的系统中完成的 询问 从word id(271和8596,例如)选择所有记录并按排序 (所有记录都包含按权重和排序的两个单词),然后是按权重排序的单词1和单词2 SELECT DISTIN

我有这个模式,这将坐在一个爬虫的后面<代码>mitza.mine.nu 我不擅长SQL,并且我遇到了接近的结果。但问题是 快到尽头了。因为2个单词几乎需要一分钟,而
3个单词永远需要
在4555条记录上
。(当前生命样本运行另一个查询)

que做到了这一点:

  • 搜索
    w1 w2
    中的单词点击DICT并获取单词id。这是在一个单独的系统中完成的 询问

  • 从word id(
    271和8596,例如
    )选择所有记录并按排序
    (所有记录都包含按权重和排序的两个单词),然后是按权重排序的单词1和单词2

    SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
    links.url,words.weight,words.wordid 
    FROM links 
    JOIN words ON (words.linkid=links.linkid) 
    JOIN domain ON (domain.siteid=links.siteid) 
    WHERE links.linkid IN (SELECT linkid FROM words WHERE wordid=271)
    AND links.linkid IN (SELECT linkid FROM words WHERE wordid=8596)
    ORDER BY words.weight DESC LIMIT 0, 8
    

  • 尝试以下查询,避免重复调用链接表

    SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
        links.url,words.weight,words.wordid 
        FROM links 
        JOIN words ON (words.linkid=links.linkid) 
        JOIN domain ON (domain.siteid=links.siteid) 
        WHERE  (words.wordid=271 or words.wordid=8596)
        ORDER BY words.weight DESC LIMIT 0, 8
    

    并确保主键上有索引。

    不要使用内部查询。还应避免在where子句中使用OR,因为它不使用索引。对wordid、linkid和siteid建立索引,然后尝试以下查询:

    SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
    links.url,words.weight,words.wordid 
    FROM links 
    JOIN words ON (words.linkid=links.linkid) 
    JOIN domain ON (domain.siteid=links.siteid) 
    WHERE words.wordid  IN (271,8596)
    ORDER BY words.weight DESC LIMIT 0, 8
    
    试试这个:

    SELECT DISTINCT(links.linkid),domain.ip,links.linkid,
    links.url,words.weight,words.wordid 
        FROM links 
        JOIN 
        (SELECT linkid,weight,wordid FROM words WHERE wordid IN (271,8596)) words 
          ON (words.linkid=links.linkid) 
        JOIN domain 
          ON (domain.siteid=links.siteid) 
    ORDER BY words.weight DESC LIMIT 0, 8;
    
    可能重复的