0

私の質問を読んでくれてありがとう。MySQL と Python を一緒に使用しており、最初にこの SQL コマンドを実行しています

  SELECT T1.col1 AS t, T1.col4 AS d, T2.col3 AS e, T2.col4 AS d, T2.col7 AS p,
  T2.col13 AS de, 
  T2.col5 AS carrier, T2.col12 AS f, T2.col10 AS c
  FROM table AS T1
  JOIN table_c AS T2 ON T1.col1 = T2.col1
  ORDER BY RAND( )
  LIMIT 100000 ;

私が取り組んでいるデータベースは非常に大きく (T1 は 300 000 000 行、T2 は 300 000 行)、phpMyAdminのおかげでそれらを作成しました。col1 of T1とにもインデックスを作成しましたcol1 of T2。しかし、SQLコマンドを実行すると、tmpテーブルへのコピーフェーズメッセージでスタックします(週末全体に残しましたが、まだ同じ時点にあります)

パラメータ tmp_table_size を変更しようとしましたが、何も変わりませんでした

このコマンドを妥当な時間内に実行するための解決策が何であるかわかりません

すべての提案を歓迎します

手伝ってくれてどうもありがとう

4

2 に答える 2

1

このORDER BY RAND()トリックは、このような大きなテーブル サイズでは決して使用しないでください。ORDER BY RAND()JOINされた結果セット(あなたの場合はおそらく数億行)の各行にランダムな値を割り当て、実際にそれらすべての行を作成し、それらをディスク上でソートし、準備ができている場合にのみ選択して返すことができますあなたのためのトップ100000行。

解決策は明らかではありませんが、 MySQL の ORDER BY RAND() 関数をどのように最適化できますか?

于 2012-06-25T12:05:55.623 に答える
0
  1. クエリの内容を確認するために使用EXPLAIN EXTENDED SELECT ...します (処理する推定行数、使用中のインデックスなど)。

  2. EXPLAINクエリには「1個の警告」も表示されます。参照してください-これにより、クエリオプティマイザーSHOW WARNINGSの後でクエリがどのように見えるかが正確に示されます。

  3. テーブル構造 ( SHOW CREATE TABLE ...)、両方のテーブルのテーブル ステータス、および関連する構成 (すべての構成エントリが一致するmax**buffer**size*) を投稿します。

  4. ハードウェア構成を投稿してください (CPU - 速度?、コア数?、RAM - 合計? 無料?)

于 2012-06-25T12:02:47.620 に答える