kotaoueはそんなかんじ

kotaoueの最新情報。

MySQLのレコードランダムが遅くなってたのを対応

SELECT DIARY_ID,TITLE,PUSER FROM DIALY_MASTER ORDER BY RAND() LIMIT 10

MySQLのORDER BY RAND()は全件走査になるらしく、テーブルの件数が多くなると速度が低下して、
↑みたいなSQLの実行に1秒以上かかるようになっていたので、ちょっとだけでも高速化。

結果、↓のSQLで実行速度が0.02~0.05くらいに

SELECT DIARY_ID,TITLE,PUSER FROM DIALY_MASTER
WHERE UPDATEDATE MOD 10 = FLOOR(0+(RAND()*10)) ORDER BY RAND() LIMIT 10


今回はUPDATEDATEを10で割ったものと0~9の乱数を比較してからORDER BY RAND()した。
テーブルのサイズが大きくなれば、UPDATEDATEをより大きな数で割れば良いと思うし、
DATE型だと60分割までしか出来ないので、数値型のカラムがあればそれ使っても良いと思うし。

        ______________
.∩_∩  /
(,,´(x)`)<  ちょっとはマシになった?
(つ( ))  \
.∪⌒∪    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 

あっ、該当のレコードがあるかどうかは、↓とかで一応チェックしてね。

SELECT * FROM (SELECT DISTINCT UPDATEDATE MOD 10 FROM DIALY_MASTER) AS A ORDER BY 1


コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。