2013-05-15 89 views
1

该查询可以正常工作,但执行时间过长。它在xampp localhost上运行。此SQL查询是否有优化?

只是我想选择webpage.id其中字=“财产以后”和字 =“另一个财产以后”

我的意思是,如果你在谷歌搜索,你可以使用快捷键 “蟒蛇! - 猫“ 这意味着获得所有包含单词”python“而不包含单词”cat“的链接。

SELECT webpage.title, word.title, word.id, webpage.title, webpage.id, webpage.link, wordpage.wordID, wordpage.id, wordpage.type, wordpage.pageID 
FROM SE_word AS word 
INNER JOIN se_wordpage AS wordpage ON wordpage.wordID = word.id 
INNER JOIN se_webpage AS webpage ON wordpage.pageID = webpage.id 
WHERE word.title = "python" 

AND webpage.id NOT IN ( 
SELECT WP.id 
FROM se_webpage AS WP 
INNER JOIN se_wordpage AS WOP ON WP.id = WOP.pageID 
INNER JOIN se_word AS W ON W.id = WOP.wordID 
WHERE W.title = "cat" 
) 
GROUP BY webpage.id 
ORDER BY webpage.title DESC 

它例如

table se_Word is 
**id | title** 
1 | "game" 
2 | "java" 
3 | "python" 

table se_WebPage is 
**id | title** 
1 | "www.ABCDEF.com" 
2 | "www.ABCDR.net" 
3 | "www.ABC.com" 


table se_WordPage is 
**id | pageID | wordID** 
1 | 1 | 1 
2 | 2 | 3 
3 | 3 | 3 
3 | 2 | 1 

结果简单的搜索引擎应该webpage.id = 3

here is创建脚本 是否有任何优化?

在此先感谢。

+1

1.使用'EXPLAIN'提供执行计划2.提供所有表模式 – zerkms

+0

我已经添加了它。谢谢 –

+0

@Strawberry你的意思是子查询? 我认为主要查询中列的值不同于你没有添加的子查询 –

回答

0

使用“不在”是缓慢的。如果你的数据库支持这里的语法有两种更快的方法。

where not exists 
(your subquery) 

where webpage.id in 
(select id 
from se_webpage 
except 
select id 
from 
the rest is as per your existing subquery 
) 

你们用的,而不是 “除” 关键词 “减” 一些分贝引擎。

+0

MySQL既不支持MINUS,也不支持EXCEPT。 –

+0

不存在的工作正常,但时间是在附近相同!谢谢花花公子 –

0

我认为,如果你能摆脱不了一块,那么你应该看到一个健康的性能提升。尝试使用这两个等价语句作为如何重写语句的示例。

声明1:

select ID, PreferredMethods 
from ContactPrefs 
where type='Mail' and 
ID NOT IN 
(select ID from ContactPrefs where type='Email' or type='Phone' or type='Text') 

声明1等同于声明2,但Statment 2将有更好的表现:

select ID, PreferredMethods from ContactPrefs c1 
left outer join 
ContactPrefs c2 on c1.ID=c2.ID 
and (c2.type='Email' or c2.type='Phone' or c2.type='Text') 
where c1.type='Mail' and c2.id is null 
0

你可能想考虑沿these lines的解决方案 - 提供一些个月前由另一个论坛上的人(我知道,我知道)完全。

此外,您的查询会更有意义(我反正)这样写的第一部分(注意没有GROUP BY子句 - 这是故意的)...

SELECT DISTINCT p.title p_title 
       , w.title w_title 
       , w.id w_id 
       , p.id p_id 
       , p.link 
       , wp.id 
       , wp.type 
      FROM SE_word w 
      JOIN se_wordpage wp 
      ON wp.wordID = w.id 
      JOIN se_webpage p 
      ON p.id = wp.pageID 
      WHERE w.title = "python" 
0

我做没有测试过这个查询,但我认为它可以完成这项工作。请让我知道它是否正常工作。

根据您的原始查询,我只是删除了子查询,该WHERE子句中添加了“猫”的称号,并增加了HAVING条款选择只是一个时间的GROUP BY的网页后,进行过滤和这个选择是指“python”标题。

我假设你从来没有多次给一个给定的网页分配一个给定的单词。

SELECT 
    webpage.title, 
    word.title, 
    word.id, 
    webpage.title, 
    webpage.id, 
    webpage.link, 
    wordpage.wordID, 
    wordpage.id, 
    wordpage.type, 
    wordpage.pageID 
FROM se_word AS word 
INNER JOIN se_wordpage AS wordpage 
    ON wordpage.wordID = word.id 
INNER JOIN se_webpage AS webpage 
    ON wordpage.pageID = webpage.id 
WHERE word.title IN ("cat", "python") 
GROUP BY webpage.id 
HAVING 
    COUNT(webpage.id) = 1 
    AND word.title = "python" 
ORDER BY webpage.title DESC; 

希望它运作良好,并帮助您!再见。

编辑

我测试了我的查询(MySQL的5.5.22),它似乎是工作的罚款!这是我的表结构及数据:

se_word

 
---- -------- 
| id | title | 
---- -------- 
| 1 | game | 
| 2 | java | 
| 3 | python | 
| 4 | cat | 
---- -------- 

se_webpage

 
---- ------ ----------- ------ --------------------- 
| id | link | title  | freq | date    | 
---- ------ ----------- ------ --------------------- 
| 1 | NULL | aaaaa.com | 0 | 2013-05-15 22:27:40 | 
| 2 | NULL | bbbbb.com | 0 | 2013-05-15 22:27:40 | 
| 3 | NULL | ccccc.com | 0 | 2013-05-15 22:27:40 | 
| 4 | NULL | ddddd.com | 0 | 2013-05-15 22:27:40 | 
---- ------ ----------- ------ --------------------- 

se_wordpage

 
---- -------- -------- ------ 
| id | wordID | pageID | type | 
---- -------- -------- ------ 
| 1 |  3 |  1 |  | 
| 2 |  3 |  2 |  | 
| 3 |  3 |  3 |  | 
| 4 |  3 |  4 |  | 
| 5 |  4 |  2 |  | 
| 6 |  4 |  4 |  | 
---- -------- -------- ------ 

由于“python”这个词是指所有的网页,而“cat”这个词是指第二个和第四个网页,预期的输出(据我所知)应该是第一个和第三个网页一些更多的数据)。所以,查询效果很好!

输出

 
----------- -------- ---- ----------- ---- ------ -------- ---- ------ -------- 
| title  | title | id | title  | id | link | wordID | id | type | pageID | 
----------- -------- ---- ----------- ---- ------ -------- ---- ------ -------- 
| ccccc.com | python | 3 | ccccc.com | 3 | NULL |  3 | 3 |  |  3 | 
| aaaaa.com | python | 3 | aaaaa.com | 1 | NULL |  3 | 1 |  |  1 | 
----------- -------- ---- ----------- ---- ------ -------- ---- ------ -------- 

的外观,列在相同的顺序在查询语句。

让我知道是否有问题。

+0

'HAVING COUNT(webpage.id)= 1' 错误> –

+0

我的错,对不起。 HAVING子句在ORDER BY之前。你能否再次尝试编辑后的查询? –

+0

退货NUll >>>> –