現在、約330,000レコードを格納しているMySQLテーブルがあります。15個のランダムなレコードをプルするために、すばやく効率的なクエリを作成する必要がありますが、フラグに基づくwhere句を使用します。
たとえば、私が試したいくつかのオプション(私が追加するかもしれない悪い効率で):
SELECT col1、col2、col3 FROM tbl WHERE flag IN('opt1'、'opt2'、'opt3')ORDER BY RAND()LIMIT 15;
このクエリには約3秒かかりますが、これは遅すぎます。私が使用していた別のオプションは、返される目的の行の数(この場合は15)を取得し、要求されたフラグを持つ行の総数($ xに等しい)で除算して、次のクエリを実行することでした。
SELECT col1、col2、col3 FROM tbl WHERE RAND()<='$ x'AND flag IN('opt1'、'opt2'、'opt3');
これは通常14〜16行を返すので、大したことではありません。正確に15を返す必要はありませんが、閉じます。このオプションを使用すると、クエリ時間が1秒短縮されますが、本番環境で使用するにはまだ長すぎます。
すべてのレコードに1から始まるID番号が割り当てられていることに注意してください。穴はありません。
多分私はこれを考えすぎています。誰かが彼らが使用した良い選択肢がありますか?
ありがとう!