2011-07-08 4 views
0

私が取り組んでいるプロジェクトでは、ベストマッチのためにキーをスキャンする必要があります。これらのスキャンだけが、テストシステムに負荷をかけています。どのように私はこれを改善することができるすべてのボディアイデア?私たちはすでに一時テーブルとカーソルを試しました。MySQL:ベストマッチを改善するための提案ストアドプロシージャ

我々が使用しているコードの例:代わりにちょうどIF EXISTSを使用SELECT COUNT(*)を使用しての

SET keyLength = (LENGTH(key)-1); 
WHILE keyLength >=1 DO 
    SELECT COUNT(*) INTO resultCount FROM keytable 
    WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength)); 
    IF (0 < resultCount) THEN 
     SELECT ScreeningKey INTO bestMatchScreeningKey FROM keytable 
     WHERE AND ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength)); 

     /*go to step4*/ 
     LEAVE Step4; 
    END IF; 
    SET keyLength = keyLength-1; 
END WHILE; 
+0

このコードは正確に何を実行しようとしていますか?そして、これはすべての手続きですか、あるいは一部ですか? –

答えて

1

IF EXISTSは、一致が見つかるとすぐにスキャンを停止できますが、COUNT(*)はそのカウントを集計するためにテーブル全体を通過する必要があります。

こうすると、次のような結果に終わります。(私は多くのMySQLを使用しないため、構文がわからないため、私の見た目には似つかない構文をコピーして貼り付けました。 )

SET keyLength = (LENGTH(key)-1); 
WHILE keyLength >=1 DO 
    IF EXISTS (SELECT * FROM keytable 
       WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength))) THEN 
     SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey; 

     /*go to step4*/ 
     LEAVE Step4; 
    END IF; 
    SET keyLength = keyLength-1; 
END WHILE; 
+0

存在する構成があるかどうかわからない –

+0

TSQLにはありますが、MySQLは異なる場合があります。 'SET resultCount = SELECT 1 WHERE EXISTS(...)'を試してください –

+0

MySQLには確かに 'EXISTS'構文がありますが、私が持っているように' IF'文で使用できるかどうかはわかりません。 COUNT(*)を避けるために、簡単に修正することもできます。 MySQLサーバを手元に持っている人(私は家のマシン上にあるだけです)が確認できれば、必要に応じて私の答えを書き直すことができます。 (http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html) –

0

どのようにこのような何か?

データが見つからないたびに、レコードが見つかるまで例外ブロック(LEAVEをスキップ)にジャンプします。

これにより、反復ごとに2つの選択を行う必要がなくなります。

注LIMIT 1を追加して、選択が複数の行を返す可能性をなくしました。

SET keyLength = (LENGTH(key)-1); 
WHILE keyLength >=1 DO 
BEGIN 
    SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey LIMIT 1; 
    LEAVE Step4; 
EXCEPTION 
    WHEN no_data_found THEN 
     NULL; 
    WHEN others THEN 
     RAISE; 
END; 
    SET keyLength = keyLength-1; 
END WHILE; 
関連する問題