タグ

2016年7月25日のブックマーク (4件)

  • [MySQL]ORDER BY RAND()について - かけだしエンジニアの独り言

    2008年10月15日 15:13 カテゴリMySQL [MySQL]ORDER BY RAND()について Posted by kistame228 No Comments No Trackbacks Tweet MySQLのORDER BY RANDはランダムに値を取得してくれる 便利なのだけど、RANDを利用すると全文走査するので 大きなテーブルだと非常に重くなってしまう。 で、見つけたのが以下のAntonさんのブログ ◆“Do not use ORDER BY RAND()” or “How to get random rows from table?” ↑をザックリ訳してみると ・RANDは使うな ・じゃぁどうするのか 1-1.SELECT COUNT(*) AS cnt FROM quotes で全件数を取得 1-2.1-1で取得した数値からランダムな値をプログラムで生成 1-

  • ORDER BY RAND()の代わりを実装する、あるいはMySQLでランダムにデータを取ってくる方法についてのメモ - Line 1: Error: Invalid Blog('by Esehara' )

    こんにちは。相変わらずBookableというサービスをこつこつとやっているのですが、前回に「ORDER BY RAND()を使うと重くなる」という話を書いたところ、知人から「それやめろ」という斧であったり、あるいは他の方面からアドバイスを頂きました(Thanks グニャラくん!)。 なんでORDER BY RAND()がダメなの?という話は、ちょっと息抜きに翻訳したものがあるのですが、まず問題としてMySQLの乱数を生成するコストが高いという問題がある様子。少なくとも全件に対して乱数を発行するし、そして並び替えも発生してしまうので、とにかく非効率であると。だからその辺はMySQLにまかせるのではなく、それを呼び出すプログラム側にまかせたほうが圧倒的に効率がよくなるようです。 例えば、RANDでやると、下のように件数が増えるにつれて負荷が膨大になっていきます。 djangoの場合、元々のOM

    ORDER BY RAND()の代わりを実装する、あるいはMySQLでランダムにデータを取ってくる方法についてのメモ - Line 1: Error: Invalid Blog('by Esehara' )
  • MySQLのrand()ランダム関数の負荷問題を考えてみる

    MySQLで結構使う場面が多いランダム関数rand()ですが、間違った指定をするとデータベースに思わぬ負荷をかけることになります。 今回はMySQLの指定方法からどの程度の負荷が掛かるのかを簡単にまとめ、DB設計の見直しや理想のプログラムも参考程度に掲載してみます。 テーブルからランダムに取り出す時の負荷 もちろん少ないレコードならば大きな問題にはなりませんが、数十万行といった大規模データになってくると以下の負荷がかかって一瞬でサーバーダウンも夢ではなくなりますので注意が必要ですね。 無指定ランダム SELECT * FROM table ORDER BY RAND(); この指定は最悪かもしれません。全件取得と同等の負荷が掛かります。MySQLなどのDBは効率化を考えた記述ができる部分には積極的に利用していかないと、サーバーが悲鳴をあげます。 取得件数指定ランダム SELECT * FR

    MySQLのrand()ランダム関数の負荷問題を考えてみる
  • Using filesort

    去年ソートに関する記事を書いたが、今日はその続きである。 MySQLでEXPLAIN SELECT...を実行するとExtraフィールドでよく見かける「Using filesort」という文字列。Filesortって一体なんだろう?と思ったことはないだろうか。単刀直入に言ってFilesortの正体はクイックソートである。 クエリにORDER BYが含まれる場合、MySQLはある程度の大きさまでは全てメモリ内でクイックソートを処理する。ある程度の大きさとはsort_buffer_sizeであり、これはセッションごとに変更可能である。ソートに必要なメモリがsort_buffer_sizeより大きくなると、テンポラリファイル(テンポラリテーブルではない)が作成され、メモリとファイルを併用してクイックソートが実行される。 Filesortは全てのソート処理において実行されるわけではない。前回の記事

    Using filesort