「rand()による高速注文」のようなものはありませんが、特定のタスクの回避策があります。
ランダムな行を1つ取得する場合 、このドイツのブロガーのように行うことができます: http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a-代替案のケーススタディ/ (ホットリンクのURLが表示されませんでした。誰かが表示された場合は、リンクを編集してください。)
テキストはドイツ語ですが、SQLコードはページの少し下にあり、大きな白いボックスに入っているため、見づらいわけではありません。
基本的に彼が行うことは、有効な行を取得するジョブを実行するプロシージャを作成することです。これにより、0からmax_idまでの乱数が生成され、行をフェッチしてみます。存在しない場合は、存在する行に到達するまで続行します。彼は、一時テーブルに格納することでx個のランダムな行をフェッチできるので、おそらく1行だけをフェッチする方が少し速くなるようにプロシージャを書き直すことができます。
これの欠点は、多くの行を削除し、大きなギャップがある場合、それが何回も見逃して効果がなくなる可能性が高いことです。
更新:実行時間の違い
インデックス作成に関係している可能性があります。 id
username
を追加しながら、インデックスが作成されてすばやくアクセスできます 結果に対して、各行からそれを読み取り、メモリテーブルに配置する必要があることを意味します。 *
を使用 また、すべてをメモリに読み込む必要がありますが、データファイルを飛び回る必要はありません。つまり、検索に時間を費やす必要はありません。
これは、可変長の列(varchar / text)がある場合にのみ違いがあります。つまり、各行の間で設定された長さ(または0)をスキップするのではなく、長さをチェックしてからその長さをスキップする必要があります。
>