1

Table a約 8,000 行あり、table b約 250,000 行あります。関数がなければ、levenshteinクエリは 2 秒弱かかります。機能込みで約25分。

SELECT
      *
   FROM
      library a,
      classifications b
   WHERE  
      a.`release_year` = b.`year`
      AND a.`id` IS NULL
      AND levenshtein_ratio(a.title, b.title) > 82
4

3 に答える 3

1

あなたは実際にあなたを助けるには少なすぎる情報を与えています。

1)私の最初の推測は、スキャンされる行の量を減らす他のWHERE条件を作成しようとすることです。

2)それが不可能な場合...テーブルライブラリのタイトルと分類がわかっている場合、1つのアイデアは、すべてのデータが次のようにすでに計算されているテーブルを作成することです。

TABLE levenshtein_ratio
id_table_library
id_table_classifications
precalculated_levenshtein_ratio

したがって、次のクエリを使用してテーブルにデータを入力します。

insert into levenshtein_ratio select a.id, b.id, levenshtein_ratio(a.title, b.title) from library, classifications

次に、クエリは次のようになります。

    SELECT
          *
       FROM
          library a LEFT JOIN 
          classifications b ON a.`release_year` = b.`year`

LEFT JOIN levenshtein_ratio c ON c.id_table_library = a.id AND c.id_table_classifications = b.id
       WHERE  
          a.`id` IS NULL
          AND precalculated_levenshtein_ratio > 82

このクエリは、おそらく元の2秒以内になります。

このソリューションの問題は、テーブルaとbのデータが変更される可能性があるため、更新を維持するためのトリガーを作成する必要があるという事実です。

于 2013-01-31T00:57:52.467 に答える
1

それlevenshtein_ratioはあなたが書いた(または他の場所から含まれているかもしれない)関数だと思います。その場合、データベース サーバーは、インデックスを使用するという通常の意味でそれを最適化できません。したがって、他の結合条件から生じるレコードごとに呼び出すだけでよいことを意味します。内部結合を使用すると、これらのテーブル サイズでは非常に大きな数になる可能性があります (最大 8000*250000 = 20 億)。これで呼び出す必要がある合計回数を確認できます。

SELECT
      count(*)
   FROM
      library a,
      classifications b
   WHERE  
      a.`release_year` = b.`year`
      AND a.`id` IS NULL

これは、なぜ遅いのかの説明です (実際には、最適化方法の問題に対する答えではありません)。これを最適化するには、結合条件に制限要因を追加して、ユーザー定義関数の呼び出し回数を減らす必要がある可能性があります。

于 2013-01-31T00:44:47.673 に答える
0

適切な結合を使用するようにクエリを変更します(構文は1996年から使用されています)。

また、すべてのlevensrein条件が結合条件に移行される可能性があります。これにより、パフォーマンスが向上します。

SELECT *
FROM library a
JOIN classifications b
    ON a.`release_year` = b.`year`
    AND levenshtein_ratio(a.title, b.title) > 82
WHERE a.`id` IS NULL

また、b.yearにインデックスがあることを確認してください。

create index b_year on b(year);
于 2013-01-31T00:49:10.400 に答える