データベースからすべてのユーザーを返し、参照郵便番号から最短距離で結果を並べ替えるシステムがあります。
例:ユーザーがサイトにアクセスし、郵便番号を入力すると、自分の郵便番号に最も近い他のすべてのユーザーが返されます(昇順)。
私は今これをどのようにやっていますか、そしてなぜそれが問題なのですか?
システムには、3,000万人を超えるユーザーとその郵便番号が含まれています。特定の州と都市のすべてのユーザーを取得しています(データセットを約10,000に絞り込みます)。
これが実際に問題が発生する場所です。これで、mysql(10,000)行からPHPに送信されたすべての結果が郵便番号計算ライブラリに送信されます。このライブラリは、基本郵便番号とユーザーの郵便番号の間のこの距離を10,000回計算します。次に、最も近い郵便番号で結果を並べ替えます。
ご覧のとおり、これは非常に最適化されていないコードです。また、10,000レコードは2回ループされます。各httpdプロセスがmysqlとの間でデータを転送するだけで必要なRAMの量は言うまでもありません。
これを最適化するためにとにかくそこにあるここの教祖に私が聞きたいことは何ですか?
私は自分のアイデアをいくつか持っていますが、それらがどれほど効率的かはわかりません。
mysql自体ですべての郵便番号の計算と順序付けを実行し、ページ化された行数を返すようにしてください。このために、郵便番号計算ロジック間の距離をストアドプロシージャに移動する必要があります。このようにして、PHPで10,000レコードが処理されないようにしています。ただし、まだ問題があります。すでに計算されている郵便番号の距離を計算する必要はありません(同じ郵便番号を持つ2人のユーザーの場合)。
次に、ストアドプロシージャを使用してmysqlの行を並べ替えるにはどうすればよいですか?
皆さんはどう思いますか ?これは良い方法ですか?これを使用してパフォーマンスの向上を期待できますか?他に何か提案はありますか?
私はこの質問が巨大であることを知っています、そして私はあなたが最後まで読むのにかかった時間を本当に感謝します。これについてのあなたの考えを本当に聞きたいです。