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でスマートに解決できません。