<code>请教: 现在有每天的日表数据(一天生成一张), 每张表数据大概在500w左右。 需要从每天的日表数据中统计:根据appid统计ip数,同时ip需要去重。 大概的sql是:</code>
App-ID auswählen, count(distinct(ip)) aus log0812_tb, wobei iptype = 4 nach App-ID gruppiert ist;
<code>然后将统计的appid 和 ip数,放入到另一张统计表中。 1、直接执行sql的话,肯定超时了(系统仅配置了400ms读取时间)。 2、如果将数据都取出到内存中再做操作,内存又不足了,给的内存只有50M。。。(不为难程序员的需求不是好公司) 请问,还有优化的解决方案吗? 谢谢 </code>
<code>请教: 现在有每天的日表数据(一天生成一张), 每张表数据大概在500w左右。 需要从每天的日表数据中统计:根据appid统计ip数,同时ip需要去重。 大概的sql是:</code>
App-ID auswählen, count(distinct(ip)) aus log0812_tb, wobei iptype = 4 nach App-ID gruppiert ist;
<code>然后将统计的appid 和 ip数,放入到另一张统计表中。 1、直接执行sql的话,肯定超时了(系统仅配置了400ms读取时间)。 2、如果将数据都取出到内存中再做操作,内存又不足了,给的内存只有50M。。。(不为难程序员的需求不是好公司) 请问,还有优化的解决方案吗? 谢谢 </code>
Lassen Sie uns zunächst über die möglichen Optimierungen in der folgenden Tabelle sprechen:
Erstellen Sie einen kombinierten Index (Appid, IP)
IP speichert ganze Zahlen, keine Zeichenfolgen
Wenn immer noch eine Zeitüberschreitung auftritt, versuchen Sie, die Daten in den Speicher einzulesen, aber Ihr Speicher ist nur 50 MB groß. Dann können Sie versuchen, HyperLogLog zu verwenden. Der verbrauchte Speicher ist sehr gering, aber die statistischen Daten sind leicht verzerrt. ca. 2%
Schließlich ist es am besten, diese Art von Protokolldaten nicht in SQL zu speichern. Sie können einige Nosqls wie hbase und mongodb auswählen, die Ihren Anforderungen entsprechen
@manong
Vielen Dank, die beiden Optimierungslösungen, die Sie erwähnt haben, sind beide gut.
Ich habe einen gemeinsamen Index aus Typ-ID, App-ID und IP erstellt, sodass diese Anweisung über die Indexabfrage ausgeführt wird, ohne die Tabelle zurückzugeben, und die Zeit unter 1,5 Sekunden gehalten wird, was effektiv ist.
Was den HyperLogLog-Algorithmus betrifft, habe ich ihn nur kurz nachgeschlagen und nicht in die Praxis umgesetzt, aber vielen Dank für die Empfehlung.
Ich verwende eine andere Methode zur Verarbeitung: Planen Sie Aufgaben, um die 5 Millionen Daten in Stapeln zu verarbeiten. Nachdem Sie die Daten zweimal dedupliziert haben, führen Sie array_diff aus, um die zweiten unterschiedlichen Daten zu vergleichen, und summieren Sie sie dann, um die Gesamtzahl zu erhalten. Auf diese Weise kann die Zeit auch unter 1s gesteuert werden. Ein Trick besteht darin, das Array des ersten Vergleichs in einen String umzuwandeln und ihn dann im Array für den zweiten Vergleich zu speichern. Dadurch wird viel Speicher gespart, da verschachtelte Arrays nach dem Ausprobieren länger sind als lange Zeichen. Arrays von Zeichenfolgenwerten verbrauchen Speicher.