sql >> データベース >  >> RDS >> PostgreSQL

Python / PostgreSQLをどのように高速化しますか?

    プロファイリングに時間を無駄にしないでください。時間は常にデータベース操作にあります。できるだけ少なくしてください。インサートの最小数。

    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ステートメントを動的に作成しないでください。一度もない。



    1. (My)SQLインジェクションを防ぐために、どの文字をエスケープする必要がありますか?

    2. データベースから最も近い(距離)レコードを効果的に選択する

    3. Heroku Rails 4がサーバーに接続できませんでした:接続が拒否されました

    4. Phalconのパフォーマンス関連のクエリ