ホームページ  >  記事  >  バックエンド開発  >  毎日 500 万以上のテーブル データをカウントするための MySQL ソリューション?

毎日 500 万以上のテーブル データをカウントするための MySQL ソリューション?

WBOY
WBOYオリジナル
2016-08-18 09:15:561333ブラウズ

リーリー

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;

リーリー

まず、以下の表で可能な最適化について説明しましょう:

  1. 結合インデックス(appid、ip)を作成します

  2. IPは文字列ではなく整数を保存します

それでもタイムアウトになる場合は、メモリにデータを読み込んでみてください。ただし、メモリが 50M しかない場合は、HyperLogLog を使用してみてください。消費されるメモリは非常に少ないですが、統計データはわずかに偏ります (約 2)。 %

最後に、この種のログ データを SQL に保存しないことが最善です。ニーズに非常に適した hbase や mongodb などの nosql を選択できます。

@manong

ありがとうございます。あなたが言及した 2 つの最適化ソリューションはどちらも優れています。

typeid、appid、ip の結合インデックスを構築したので、このステートメントはテーブルを返さずにインデックス クエリを通じて実行され、時間は 1.5 秒未満に制御され、効果的です。

HyperLogLogのアルゴリズムに関してはざっと調べただけで実践には至りませんでしたが、オススメしていただきありがとうございます。

別の方法で処理します。これらの 500 万以上のデータをバッチで処理するタスクをスケジュールします。データを 2 回重複排除した後、array_diff を実行して 2 番目の異なるデータを比較し、合計して合計数を取得します。 このようにして、時間を 1 秒未満に制御することもできます。 ここでの秘訣は、最初の比較の配列を文字列に変換し、それを配列に格納することです。これを試してみると、ネストされた配列は長くなるため、大量のメモリを節約できます。文字列値の配列は長い文字よりもメモリを消費します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。