0

いくつかの類似点 (約 7,000 万件) を事前計算しており、あるトラックから他のすべてのトラックへの類似点を見つけたいと考えています。類似度が最も高い上位 100 トラックのみが必要です。私の計算では、さまざまなトラックを入力として、このクエリを約 15,000 回実行します。マシンの起動後、15,000 のクエリすべてで 1 回の計算に 600 秒以上かかります。数回実行した後、mysqlはインデックスをキャッシュしたと思いますので、完全な実行には約15秒かかります。私の唯一の心配は、「Handler_read_rnd_nextDokumentation」の値が非常に高いことです。

次の構造の MySQL テーブルがあります。

CREATE TABLE `similarity` (
  `similarityID` int(11) NOT NULL AUTO_INCREMENT,
  `trackID1` int(11) NOT NULL,
  `trackID2` int(11) NOT NULL,
  `tracksim` double DEFAULT NULL,
  `timesim` double DEFAULT NULL,
  `tagsim` double DEFAULT NULL,
  `simsum` double DEFAULT NULL,
  PRIMARY KEY (`similarityID`),
  UNIQUE KEY `trackID1` (`trackID1`,`trackID2`),
  KEY `trackID1sum` (`trackID1`,`simsum`),
  KEY `trackID2sum` (`trackID2`,`simsum`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

私はこれについて非常に多くの質問をしたいです。クエリは次のようになります。

// simsum is a sum over tracksim, timesim, tagsim
(
     SELECT similarityID, trackID2, tracksim, timesim, tagsim, simsum
     FROM similarity
     WHERE trackID1 = 512
     ORDER BY simsum DESC
     LIMIT 0,100
 )
 UNION
(
     SELECT similarityID, trackID1, tracksim, timesim, tagsim, simsum
     FROM similarity
     WHERE trackID2 = 512
     ORDER BY simsum DESC
     LIMIT 0,100
 )
 ORDER BY simsum DESC
 LIMIT 0,100

クエリは非常に高速で 0.1 秒未満 (前の質問) ですが、ステータス ページの非常に膨大な数が心配です。クエリで使用しているすべてのインデックスを設定したと思いました。

Handler_read_rndDokumentation   88,0 M
Handler_read_rnd_nextDokumentation  20,0 G

何か間違っていることでも"?クエリをさらに速く取得できますか? 20G について心配する必要はありますか?

前もって感謝します

4

1 に答える 1

0

ここで明らかに間違っている最初のことは、タプル間の方向関係を計算しているように見えることです- f(a,b)===f(b,a) の場合、track1 とtrack1 は track2 より大きいが、既存の主キーを保持します (衝突は無視されます)。

データ量が半分になるだけなので、パフォーマンスが大幅に向上することはありません。

パフォーマンスを改善する余地はさらにあるかもしれませんが、これはデータが変更される頻度に大きく依存します。より具体的には、類似度が上位 100 に含まれていないレコードを削除する必要があります。

于 2012-04-11T10:13:43.267 に答える