これは少なくともこのスレッドで以前に尋ねられたことを知っています: is php sort better than mysql "order by"?
ただし、PHP 側での並べ替えのパフォーマンスはほぼ 40 倍高速であるため、ここでの適切なオプションについてはまだ確信が持てません。この MySQL クエリは約 350 ~ 400 ミリ秒で実行されます
SELECT
keywords as id,
SUM(impressions) as impressions,
SUM(clicks) as clicks,
SUM(conversions) as conversions,
SUM(not_ctr) as not_ctr,
SUM(revenue) as revenue,
SUM(cost) as cost
FROM visits WHERE campaign_id = 104 GROUP BY keywords(it's an integer) DESC
Keywords および Campaign_id 列はインデックス化されています。
約 150k 行を使用し、合計で約 1500 行を返します。その後、結果が再計算されます (クリック率、コンバージョン率、ROI など、および結果セット全体の合計が計算されます)。計算は PHP で行われます。
今私の考えは、PHP APC で結果を保存してすばやく取得することでしたが、これらの結果を列と計算された値で並べ替えることができる必要があるため、クリックスルー率で並べ替える場合は、クエリ内で使用
(SUM(clicks) / (SUM(impressions) - SUM(not_ctr))
すると、約 40 ミリ秒遅くなり、最初の 400 ミリ秒はすでに非常に長い時間です。
さらに、これらの結果をページ分割しますが、LIMIT 0,200 を追加してもパフォーマンスには実際には影響しません。
APC アプローチをテストしている間、クエリを実行し、追加の計算を行い、配列をメモリに保存したので、最初のリクエスト中に一度だけ実行され、魅力的に機能しました。メモリからの配列のフェッチとソートには約 10 ミリ秒しかかかりませんでしたが、スクリプトのメモリ使用量は約 25 MB でした。結果をメモリテーブルにロードしてから、そのテーブルを直接クエリする価値があるのではないでしょうか?
これはすべて、デフォルトのMySQLがインストールされているローカルマシン(i7、8GB RAM)で行われ、実稼働サーバーはまだテストしていないRackspaceの512MBのボックスであるため、可能であればサーバーのセットアップを無視します。
したがって、本当の問題は次のとおりです。メモリテーブルを使用する価値はありますか、それとも、いつでも RAM をアップグレードできるため、PHP の並べ替えを使用して RAM の使用を無視する必要がありますか? パフォーマンスを最適化するために、他にどのようなオプションを検討しますか?