プロファイリングに時間を無駄にしないでください。時間は常にデータベース操作にあります。できるだけ少なくします。最小限の挿入数です。
三つのこと。
1。Date、Hostname、および Person ディメンションを一致させるために何度も SELECT を実行しないでください。すべてのデータを Python ディクショナリに 1 回フェッチし、メモリ内で使用します。シングルトン選択を繰り返さないでください。パイソンを使用します。
二。更新しないでください。
具体的には、これをしないでください。これは 2 つの理由で悪いコードです。
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
単純な SELECT COUNT(*) FROM ... に置き換えてください。更新してカウントをインクリメントしないでください。そこにある行を SELECT ステートメントで数えるだけです。[単純な SELECT COUNT または SELECT COUNT(DISTINCT) でこれを行うことができない場合は、一部のデータが欠落しています。データ モデルは常に正しい完全なカウントを提供する必要があります。更新しないでください。]
と。文字列置換を使用して SQL を構築しないでください。完全にばか。
なんらかの理由でSELECT COUNT(*)
十分に高速でない場合 (何もできないことを行う前にまずベンチマーク)、カウントの結果を別のテーブルにキャッシュできます。すべてのロードの後。aSELECT COUNT(*) FROM whatever GROUP BY whatever
を実行して、これをカウントのテーブルに挿入します。更新しないでください。これまで。
三。バインド変数を使用します。いつも。
cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )
SQL は変更されません。バインドされた値は変更されますが、SQL は決して変更されません。これははるかに高速です。SQL ステートメントを動的に作成しないでください。一度もない。