ホームページ >バックエンド開発 >PHPチュートリアル >毎日 500 万以上のテーブル データをカウントするための MySQL ソリューション?
リーリー
select appid, count(distinct(ip)) from log0812_tb where iptype = 4 group by appid;
リーリーselect appid, count(distinct(ip)) from log0812_tb where iptype = 4 group by appid;
リーリー
まず、以下の表で可能な最適化について説明しましょう:
結合インデックス(appid、ip)を作成します
IPは文字列ではなく整数を保存します
それでもタイムアウトになる場合は、メモリにデータを読み込んでみてください。ただし、メモリが 50M しかない場合は、HyperLogLog を使用してみてください。消費されるメモリは非常に少ないですが、統計データはわずかに偏ります (約 2)。 %
最後に、この種のログ データを SQL に保存しないことが最善です。ニーズに非常に適した hbase や mongodb などの nosql を選択できます。
@manong
ありがとうございます。あなたが言及した 2 つの最適化ソリューションはどちらも優れています。
HyperLogLogのアルゴリズムに関してはざっと調べただけで実践には至りませんでしたが、オススメしていただきありがとうございます。
別の方法で処理します。これらの 500 万以上のデータをバッチで処理するタスクをスケジュールします。データを 2 回重複排除した後、array_diff を実行して 2 番目の異なるデータを比較し、合計して合計数を取得します。 このようにして、時間を 1 秒未満に制御することもできます。 ここでの秘訣は、最初の比較の配列を文字列に変換し、それを配列に格納することです。これを試してみると、ネストされた配列は長くなるため、大量のメモリを節約できます。文字列値の配列は長い文字よりもメモリを消費します。