2017-03-14 18 views
0
SELECT resumeid, FirstName, LastName, Mobile, State, EmailId, Role, 
     Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords 
    from Resume r 
    where DetailsCaptured='Y' 
     and resumeid IN (
       SELECT resumeid FROM Resume_Attachment ra 
        WHERE MATCH (ResumeTextContent) 
        AGAINST ('+"quality"' in boolean mode)) 
    order by UpdatedDate desc 
    limit 100 
+0

多くの詳細を提示しない限り、パフォーマンスに役立つことはできません。これを読んで質問を編集してください。特にクエリのパフォーマンスに関するセクションを読んでください。 https://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056#271056 –

+0

また、INDEXでの読解をお勧めします。索引 - DetailsCapturedの場合は1、レジュメイドの場合は1 - が役立ちます。がんばろう。 – user3741598

+0

@ user3741598 - MySQLは本質的に、単一の 'SELECT'(この場合は外側の' SELECT')で2つのインデックスを使用することはありません。それだけでは十分ではありません。 –

答えて

1

INまたはEXISTSよりもJOINを使用することをお勧めします。とにかく、少なくとも古いバージョンでは、IN (SELECT ...)は、ひどい性能を持っていました。

これが 'lazy eval'の試行である場合、追加テストがWHEREにあるため動作しません。

それでは、ただクエリを簡素化してみましょう:

SELECT resumeid, FirstName, LastName, Mobile, State, EmailId, 
     Role, Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords 
    FROM Resume r 
    WHERE DetailsCaptured='Y' 
     AND MATCH (ResumeTextContent) AGAINST ('+"quality"' in boolean mode)) 
    ORDER BY UpdatedDate desc 
    LIMIT 100 

オプティマイザ

  1. 最初FULLTEXTのルックアップを行います。これは高速ですが、100より多くを返す可能性がありますresumeid値;
  2. ステップ1で見つかった行のリーチ(私はresumeidがPRIMARY KEYであると仮定し - 。常にCREATE TABLEのSHOWを提供すると便利です)
  3. WHEREの残りの部分と一致しないこといずれかを無視 - DetailsCaptured = 'Y';
  4. ソート(ORDER BY
  5. 100行を剥がします。

「ほとんど」の行に「品質」が含まれていることを「知る」ことができない限り、それ以上に高速化することはありません。

+0

コード内の 'JOIN'はどこですか? –

+0

@SergioMontoro - 私の答えは2つの部分に分かれています:(1)なぜ「IN」が悪く、「JOIN」が良いのですか。 (2)速度の問い合わせを単純化し、 'IN/JOIN'を回避する方法。 –

0

@O。ジョーンズはコメントしましたが、確かに言うことはできません。 Indexing Detailsキャプチャされた方がパフォーマンスが向上する可能性がありますが、IN句とフルテキスト検索ではほとんどの時間がかかるでしょう。

次の代替手段を試してください。 無相関サブクエリの場合

SELECT resumeid, FirstName, LastName, Mobile, State, EmailId, Role, Skill, Relocation, EmpType, ImmType, TotalExp, Buzzwords 
FROM Resume r 
WHERE DetailsCaptured='Y' 
AND EXISTS (SELECT resumeid FROM Resume_Attachment ra WHERE ra.resumeid=r.resumeid AND ResumeTextContent LIKE '%quality%' COLLATE utf8_general_ci) 
ORDER BY UpdatedDate DESC LIMIT 100 
+0

オプティマイザがサブクエリを100回評価することを選択した場合、この式はひどく失われます。 'EXPLAIN SELECT'を見てみましょう。 –

関連する問題