2013年9月6日金曜日

MySQLで遅いRANDを高速に【お手軽版】

MySQLのRAND遅くて困ること多いですよね。

プログラマになりたての頃は常に速いRANDの方法を考えてました。

最近になってやっと常套句が見つかったので紹介します。

SELECT id
  FROM random AS r1 JOIN
       (SELECT (RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id_)
        AS r2
 WHERE r1.id >= r2.id_
 ORDER BY r1.id ASC
 LIMIT 1

受け売りなんですが、このSQLを見た時は感動しました。
AUTO_INCREMENTを使用しているテーブルならそのまま使えるでしょう。

物にもよりますが、 WHERE r1.id >= r2.id_ の後に評価式を加えて使います。
ブログサイトとかのランダム記事紹介にいいですね。

私の環境では40,000件のレコードからこのクエリでランダムにレコードを抽出すると1msかかりませんでした。
LIMITを変更してももちろん使えます。


2013年9月3日火曜日

AndroidのArrayAdapterでNoSuchMethodError

ArrayAdapterに対してAPIレベル11未満でaddAll()を行った場合発生します。
単純に11未満ではaddAll()が未実装な為です。

適当にArrayAdapterを継承してクラスを作成している場合、addAll系をすべてオーバライドしてループでadd()していくのが無難でしょう。