1

現在コーディングしている Web サイト プロジェクトがあり、車に関する情報を格納するテーブルがあります。テーブルには次のような情報があります。テーブルには約 20 列あります。行からすべての列データをランダムに取得する最速の方法を知りたいだけです。「 ORDER BY RAND() 」があることは知っていますが、使用が遅いことを読みました。テーブルが大きいため、これが問題を引き起こす可能性があるのではないかと心配しています。代替手段はありますか。

InnoDB で MySQL を使用する予定ですが、別のデータベース エンジンを使用してランダムな行をより効率的に選択できる場合は、これを変更できます。Web サイトは PHP (潜在的に RubyOnRails) を使用してコーディングされ、データベースは自動車情報 Web サイトをスクレイピングする Python スクリプトから入力されます。

テーブルには次のような行が含まれています

カーテーブル -

  • 車名
  • 自動車メーカー
  • ドア番号
  • ...
  • ...
  • ...
4

3 に答える 3

1

のパフォーマンスORDER BY RAND()が遅すぎる場合は、2 つのクエリで実行できます。まず、次のことを行います。

SELECT COUNT(*) c FROM CarTable

次に、0 から の間のランダムな整数を選択します。PHPでは次c-1のようになります。

$rownum = rand(0, $c);

次に、別のクエリを実行します。

SELECT * FROM CarTable
LIMIT :rownum, 1
于 2013-05-23T00:19:49.113 に答える
1

この方法で試すことができます。

テーブルの最大IDを見つけてください。

 SELECT id FROM car ORDER BY id DESC LIMIT 1;
 -- This result can be cached

最小 ID (または 1) と最大 ID の間の rand 値を計算します。

$rand_id = mt_rand(1, $max_id);

最も近い行を選択します。

SELECT * FROM `car` WHERE id >= ? ORDER BY id LIMIT 1;

ただし、テーブルに「穴」がある場合、結果は「真のランダム」にはなりません。でも、あなたの場合は普通だと思います。

于 2013-05-23T00:28:26.493 に答える
0

Rails では、次のようなことができます。

class MyModel < ActiveRecord::Base
  def self.random_record
    find :first, offset: rand(count)
  end
end
于 2013-05-23T00:13:55.520 に答える