sql >> データベース >  >> RDS >> Mysql

MySQLのORDERBYRAND()はどのように機能しますか?

    「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)をスキップするのではなく、長さをチェックしてからその長さをスキップする必要があります。

    >

    1. 2つの緯度/経度ポイント間の距離を見つける最速の方法

    2. Postgresqlは外部キー制約のあるテーブルを切り捨てます

    3. MySQLクエリをスケジュールする方法は?

    4. whereおよびgroupby句を使用したMysqlクエリ