MySQLでありがちなこと その1 ORDER BY RAND()

 ガチャやルーレットで、ランダムにアイテムを選択...という時に以下のようなSQLでクールに一発で決めるぜ!!としてしまいがちなのですが、大規模サービスでこれをやるとちょっとヤバイです。

SELECT * FROM gacha ORDER BY RAND() LIMIT 1

 自分もMySQLのマニュアルでこれを見つけて、これは便利!!と思ったのですが、これ、フルスキャンが発生します。

SELECT gacha_id,item_id FROM gacha ORDER BY RAND() LIMIT 1

とか、カラムを指定すれば多少ましになるようですが、根本的な解決策としては、こちらの『けんた@L』さんのエントリーORDER BY RAND()についてを参照して頂くとして、これでは、SQLでスマートに解決できません。