0

これは私を狂わせています。imdbpyを使用してimdbdbをダンプしました。映画の最初の文字で俳優のデータを利用できる米国の映画を見つけようとしています。

以下は、actoデータなしで映画をフェッチするクエリの例です。これは非常に高速に実行されます。

SELECT DISTINCT title.id,title.title,title.production_year
FROM  title

INNER JOIN movie_info ON
(movie_info.movie_id =  title.id
AND
movie_info.info_type_id = 8
AND
movie_info.info =  'USA') 

WHERE  title LIKE  'a%'
AND  title.kind_id =  1
LIMIT 75

キャストデータはと呼ばれる別のテーブルに保存され、cast_info約2,200万件のレコードが含まれています。このnr_order列には、映画の俳優のクレジットの順序が含まれています。たとえば、トムハンクスはフォレストガンプで1になります。通常、それぞれに数十の行がありますmovie_id

したがって、アクターデータが使用可能かどうかを確認するには、その特定のに対してnullではない行が少なくとも1つ存在する必要がありますmovie_id。aのすべての値がnullnr_ordermovie_id場合、必要なデータが含まれていません。

この情報を取得しようとするには、以下のクエリを使用します。

SELECT DISTINCT title.id,title.title,title.production_year
FROM  title

INNER JOIN movie_info ON
(movie_info.movie_id =  title.id
AND
movie_info.info_type_id = 8
AND
movie_info.info =  'USA') 

INNER JOIN cast_info ON 
(cast_info.movie_id = title.id
AND
cast_info.nr_order = 1)

WHERE  title LIKE  'a%'
AND  title.kind_id =  1
LIMIT 75

何らかの理由で、クエリが非常に遅くなります。最初のクエリには0.3〜.7、2番目のクエリには約6〜10秒かかります。にインデックスを追加しましたcast_infonr_orderしかし、それは役に立ちませんでした。

EXPLAIN出力:

+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+
| id | select_type | table     | type  | possible_keys                                    | key               | key_len | ref          | rows  | Extra                       |
+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+
|  1 | SIMPLE      | title     | range | PRIMARY,title_idx_title,fk_kind_type_id_4        |  title_idx_title  | 257     | NULL         | 132801| Using where; Using temporary|
|  1 | SIMPLE      | movie_info| ref   | ovie_info_idx_mid,info_type_id movie_info_idx_mid| movie_info_idx_mid| 4       | imdb.title.id| 4     | Using where; Distinct       |
|  1 | SIMPLE      | table1    | ref   | cast_info_idx_mid,nr_order                       | cast_info_idx_mid | 4       | imdb.title.id| 12    | Using where; Distinct       |
+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+

どんなアイデアもとても役に立ちます!

編集:最初のクエリからの説明

+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+
| id | select_type | table     | type  | possible_keys                                    | key               | key_len | ref          | rows  | Extra                       |
+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+
|  1 | SIMPLE      | title     | range | PRIMARY,title_idx_title,fk_kind_type_id_4        |  title_idx_title  | 257     | NULL         | 132801| Using where; Using temporary|
|  1 | SIMPLE      | movie_info| ref   | ovie_info_idx_mid,info_type_id movie_info_idx_mid| movie_info_idx_mid| 4       | imdb.title.id| 4     | Using where; Distinct       |
+----+-------------+-----------+-------+--------------------------------------------------+-------------------+---------+--------------+-------+-----------------------------+
4

1 に答える 1

1

キャスト情報が利用可能かどうかのみに関心があるため、代わりに次を使用してくださいEXISTS

SELECT DISTINCT title.id,title.title,title.production_year
FROM  title

INNER JOIN movie_info ON
(movie_info.movie_id =  title.id
AND
movie_info.info_type_id = 8
AND
movie_info.info =  'USA') 

WHERE  title LIKE  'a%'
AND  title.kind_id =  1
AND EXISTS(SELECT 1 FROM cast_info WHERE cast_info.movie_id = title.id AND cast_info.nr_order IS NOT NULL)
LIMIT 75

あなたの行動の正確な説明はわかりませんがDISTINCT、結合で多くの行、または結合された製品で少なくとも多くの行で何かおかしなことをしている可能性があります( Distinct が cast_info テーブルに適用されていることに注意してください説明)。

于 2012-10-26T17:39:05.817 に答える