昨日、レーベンシュタイン法を使うように言われたところがありました。遅いクエリですか?多分私は何か他のものを使うことができますか?
3441 次
3 に答える
3
この関数を使用してBENCHMARK
、パフォーマンスをテストできます。
SELECT BENCHMARK(10000, LEVENSHTEIN('abc', 'abd'));
ユースケースに似たさまざまな文字列でテストしてみてください。
于 2010-08-09T09:50:34.397 に答える
1
データセットによって異なります。
同じ長さの文字列を比較するだけで、かなり高速化できることがわかりました。
文字列の長さがどれだけ似ている必要があるかは、データによって異なります。
ここに主題に関する記事があります:http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up
于 2013-12-02T15:25:12.730 に答える
0
うまく機能させたい場合は、スキーマを正規化します。
問題は、他のデータがどれほど類似しているかを判断するために、DBMSがそのデータをロードし、データと比較する必要があることです。したがって、「類似した」値を見つけるには、テーブル内のすべての行(現在の行を除く)を読み取る必要があります。インデックスを使用して、データムに近いデータを見つけることはできません。
一方、次のようなスキーマを使用した場合:
CREATE TABLE member (
member_id INT(11),
member_data CLOB,
PRIMARY KEY (member_id));
CREATE TABLE about_member (
member_id INT(11),
metric VARCHAR(10),
value MEDIUMINT(9),
PRIMARY KEY (member_id, metric),
KEY by_value (metric, value, member_id));
about_member(1-1-2-2-1)文字列は、個別の行として実装する必要があることに注意してください。
member_id metric value
1234 lost 2
1234 won 3
1234 drawn 1
1234 handicap 9
次に、たとえば次のクエリを使用して、インデックスを効果的に使用できます。
SELECT compare.member_id, SUM(ABS(compare.value-datum.value)) AS difference
FROM about_member compare, about_member datum
WHERE datum.member_id=$MEMBER_TO_COMPARE
AND compare.member_id<>datum.member_id
AND compare.metric=datum.metric
AND compare.metric BETWEEN (datum.metric-1) AND (datum.metric+1) /* tweak here */
GROUP BY compare.member_id;
于 2010-08-09T10:32:41.490 に答える