0

Mysqlクエリの最適化についてサポートが必要です。

私は2つのテーブルを持っています:

jos_mp3_file(id,path,version_timestamp)

jos_mp3_licenses(id,s3_url,cdate)

それぞれに約20,000のレコードがあります。

「jos_mp3_file.path 」列のレコードには、ファイルの前に次のようなフォルダがある場合があります:'folder/file1.mp3'

私がする必要があるのは、次の場所にあるすべてのレコード見つけることです。 cdate(どちらも日時データタイプです)

これまでのところ私はこのクエリを持っていますが、何らかの理由で実行に長い時間がかかります(5-10分)

SELECT jos_mp3_licenses.s3_url, jos_mp3_licenses.cdate,  jos_mp3_file.path,jos_mp3_file.version_timestamp
FROM jos_mp3_file, jos_mp3_licenses 
WHERE SUBSTRING_INDEX( jos_mp3_file.path , '/', -1 ) = jos_mp3_licenses.mp3_url
AND unix_timestamp(jos_mp3_file.version_timestamp) > unix_timestamp(jos_mp3_licenses.cdate) 

ありがとう !

4

1 に答える 1

1

おそらく、ネストされたループ結合を実行しているため、クエリの実行に時間がかかっています。つまり、一方のテーブルのすべてのレコードを他方のテーブルのすべてのレコードと比較しています。20,000 行の場合、これは 4 億回の操作になります。

通常、テーブルを結合するときは、1 つ以上のフィールドに対して等値演算を実行する必要があります。SUBSTRING_INDEX()あなたのフィールドは同等ですが、最適化のために関数が無視されていると推測します。

最善の提案は、必要な名前をテーブルの新しい列に抽出することです。これにより、クエリを最適化できます。その列にインデックスを追加すると、パフォーマンスが向上する場合があります。

また、2 つの日時値の unix_timestamp を別の列として追加することもお勧めします。次に、適切な日付のファイル名と UNIX タイム スタンプを使用して 2 つのテーブルにインデックスを作成すると、高度に最適化されたクエリが作成されます。

于 2012-09-16T17:16:00.177 に答える