MySQL の ORDER BY RAND() パフォーマンスの最適化
MySQL クエリを最適化する場合、ORDER BY 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
この方法は、MyISAM テーブルに対して特に効率的ですが、InnoDB でもパフォーマンスが大幅に向上します。
単一のランダム レコードの場合は、別のアプローチを使用できます。
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 クエリを大幅に最適化できます。
以上がパフォーマンスを向上させるために MySQL の ORDER BY RAND() を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。