MySQL RAND() 順序付けの最適化
ORDER BY RAND() を特徴とする遅いクエリは、パフォーマンス上の課題を引き起こします。
問題
ORDER BY RAND() を使用したクエリは、特に大規模なテーブルや頻繁に更新されるテーブルで最適なパフォーマンスが得られないことがよくあります。 MySQL のソリューション (MySQLPerformanceBlog) では不十分な可能性があります。
解決策
RAND() の順序付けを最適化するには、次のアプローチを検討してください。
SELECT * FROM ( SELECT @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) vars STRAIGHT_JOIN ( SELECT r.*, @lim := @lim - 1 FROM t_random r WHERE (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
このアプローチでは、データを反復処理しながら実行確率を維持することで並べ替えを回避し、ORDER BY より効率的になります。 RAND().
単一行選択の場合
単一のランダムな行を選択するには、次のクエリを試してください:
SELECT aco.* FROM ( SELECT minid + FLOOR((maxid - minid) * RAND()) AS randid FROM ( SELECT MAX(ac_id) AS maxid, MIN(ac_id) AS minid FROM accomodation ) q ) q2 JOIN accomodation aco ON aco.ac_id = COALESCE ( ( SELECT accomodation.ac_id FROM accomodation WHERE ac_id > randid AND ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ), ( SELECT accomodation.ac_id FROM accomodation WHERE ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ) )
この最適化では次のことを前提としています。 ac_id は比較的均等に分散されていることがわかります。
以上がORDER BY RAND() を使用して MySQL クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。