2017-02-26 21 views
1

可能な限り最高のパフォーマンスでSQLクエリを実行しようとしています。複数の結合/内部結合のフィルタ条件SQL

私はランダム条件(同じ都市名に基づく)

ON `r1`.`ville_nom_reel` = `r3`.`full_name` 

と別のテーブルの結果をJOINの後、30000の結果都市間で選択したいすべての最初の。約0.010秒を実行します。私はここで

r1`.`ville_population_2012` > 10000 

が私のメインクエリとなっている結果のみを表示するようにフィルタを追加したいと思い、このクエリに 。

SELECT * FROM `inspitravel`.`villes_france_free` AS `r1` 
    JOIN (SELECT CEIL(RAND() * (SELECT MAX(`ville_id`) FROM `inspitravel`.`villes_france_free`)) AS `ville_id`) AS `r2` USING (`ville_id`) 
    INNER JOIN `inspitravel`.`villes_booking` AS `r3` 
    ON `r1`.`ville_nom_reel` = `r3`.`full_name` 

この条件でこれらの結果をフィルタリングするにはどうすればよいですか?

`r1`.`ville_population_2012` > 10000 
+0

あなたは、これはフランス語のサイトであると思わせるでしょうか?あなたはフランス語の投稿を見ましたか? –

+0

あなたの質問は、 'WHERE r1.ville_population_2012> 10000'を追加しようとしましたか? –

+0

SQL Serverタグを削除しました。これは明らかにMySQLです。 –

答えて

1

私は作品のクエリを開始します:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff 
     WHERE ville_population_2012 > 10000 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 

あなたはvilles_france_free(ville_population_2012)上のインデックスを持つこのクエリのパフォーマンスを向上させることができます。

次に、このクエリの実行時間を短縮する安全な方法は、WHERE句にrand()を使用することです。たとえば、あなたは約90%で、ソートのサイズを小さくするためにこれを使用することができます:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff 
     WHERE ville_population_2012 > 10000 AND 
      rand() < 0.1 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 

しかし、選択する正確な値は、一致の町の数によって異なります。このような

何かが正常に動作します:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff CROSS JOIN 
      (SELECT COUNT(*) as cnt FROM inspitravel.villes_france_free vff WHERE ville_population_2012 > 10000 
      ) x 
     WHERE ville_population_2012 > 10000 AND 
      (cnt < 100 OR rand() < 0.1 * cnt) 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 
+0

ありがとうございました:最後のものはとてもうまくいっています(約0.086秒)!!少なくとも今このクエリを理解するには2週間かかります:-) –

関連する問題