1

このクエリは正常に機能しますが、実行に時間がかかりすぎます。xampp localhostで実行されています。

単純に、word= "何か" AND word != "別の何か" の webpage.id を選択したいだけです。

つまり、Google で検索すると、そのショートカット「python -cat」を使用できます。これは、「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 になるはずです

ここに作成スクリプトがあります。最適化はありますか?

前もって感謝します。

4

4 に答える 4

0

「not in」を使用すると時間がかかります。データベースが構文をサポートしている場合は、2 つの高速な方法があります。

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
)

一部のデータベース エンジンでは、「except」の代わりに「minus」というキーワードを使用します。

于 2013-05-15T23:24:29.167 に答える
0

NOT IN ピースを取り除くことができれば、健全なパフォーマンスの向上が見られるはずです。ステートメントを書き直す方法の例として、これら 2 つの同等のステートメントを使用してみてください。

ステートメント 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 と同等ですが、ステートメント 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
于 2013-05-15T23:24:30.960 に答える
0

これらの線に沿った解決策を検討したいかもしれません-数か月前に別のフォーラムの誰かによって提供されました(私は知っています、私は知っています)。

さらに、クエリの最初の部分は、(とにかく私にとって) このように書かれたほうが理にかなっています (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"
于 2013-05-15T23:42:58.563 に答える