プロファイリングに時間を無駄にしないでください。時間は常にデータベース操作にあります。できるだけ少なくしてください。インサートの最小数。
3つのこと。
1。日付、ホスト名、および個人のディメンションに準拠するために、何度も選択しないでください。すべてのデータを一度Python辞書にフェッチし、メモリで使用します。シングルトン選択を繰り返し行わないでください。 Pythonを使用します。
二。更新しないでください。
具体的には、これを行わないでください。 2つの理由で悪いコードです。
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
単純なSELECTCOUNT(*)FROM...に置き換えられます。カウントをインクリメントするために更新しないでください。 SELECTステートメントでそこにある行を数えるだけです。 [単純なSELECTCOUNTまたはSELECTCOUNT(DISTINCT)でこれを実行できない場合は、一部のデータが欠落しています。データモデルは常に正しい完全なカウントを提供する必要があります。更新しないでください。]
と。文字列置換を使用してSQLを構築しないでください。完全に馬鹿げている。
何らかの理由でSELECT COUNT(*)
十分な速度ではありません(ベンチマークを最初に、何かラメを行う前に)、カウントの結果を別のテーブルにキャッシュできます。すべてのロードの後。 SELECT 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ステートメントを動的に作成しないでください。一度もない。