Mysql 9日目内部記憶コード、バインド変数

5612 ワード

ないぶきおくコード
主に、ストアド・プロシージャ、関数、時間、トリガの利点があります.
  • 便利コード再利用
  • はデータ入力から離れており、実行することで帯域幅とネットワーク遅延
  • を節約することができる.
  • mysqlは、ストレージ・プロシージャの実行計画をキャッシュすることができ、実行計画の生成の消費欠点を低減することができる:
  • ストレージ・プロシージャは、良いデバッグ・ツールが開発されていない
  • には利用可能なライブラリが多くないため、複雑な論理を実現するのは面倒です.
  • は安全ではなく、ストレージプロセスの資源消費を制御することができず、監視もよくなく、直接プログラムを引きずって死ぬ.ここで具体的な書き方は言わないで、ただ使い方と長所と短所を話します.個人はストレージプロセスのレベルが本当に悪いので、ほとんど書いたことがないので、潜在意識が抵触しており、必要でない場合は使わなくてもいいです.

  • ストアド・プロシージャと関数
    コードでCallで呼び出します.日常的な挿入やクエリーには向いていない統計に適しており、イベントと協力してタイミングタスクをしてアーカイブクラスを計算するのに適しているような気がします.統計クラスの内容は適切です.
    フリップフロップ
    行操作の場合、トリガーポイントをいくつか提供し、トリガーされた後にsql文を実行することを定義できます.一般的には、いくつかの使い方や注意すべき点があります.
  • はキャッシュまたは統計テーブルの更新操作を行う.しかし、現在は分散型key-valueキャッシュの流行や、フリップフロップ自体の行操作メカニズムは、一括更新などの操作には適していないため、
  • は少ない.
  • は、外部キーのメンテナンスにパフォーマンスが必要であるため、アプリケーション張で外部キー関係を維持することができます.フリップフロップのBEFROE INSERTを使用して外部キーチェックを行うこともできますが、フリップフロップにSELECT FOR UPDATEが使用されていないとデータが一致しない可能性がありますので注意してください.またINNODBトリガは同じトランザクションにあるため、データが一致しない確率は
  • と比較的低い.
  • は、ユーザがそれぞれ自分のライブラリで操作した後、この操作をメインライブラリに同期し、すべての操作をすべてのユーザに配布するなど、特定のコピーシーンで有用である.これにより、フリップフロップを使用して、ユーザーがローカルライブラリにデータを挿入するときにプライマリライブラリを同期し、トピックのレプリケーション機能を利用する一般的な方法は、
  • です.
    //    DB_LINK   ,link_name
    CREATE OR REPLACE TRIGGER tg_name BEFORE insert ON t_sb_info REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN insert into t_table1@link_name select *from t_table1 where year=:new.year and month=:new.month;
       insert into t_table2@link_name select *from t_table2 where year=:new.year and month=:new.month;
    END;

    ≪イベント|Events|ldap≫
  • の基本的な使用は、記憶プロセス
  • をタイミング的に実行することである.
  • は、ストレージ・プロシージャと同様に、レプリケーションに適しておらず、結果が実行された後だけ、レプリケーション結果
  • テーブルINFOMATION_SCHEMA.イベント中に各イベントステータスが表示されます.
  • は、タスクが完了していない場合、次の開始済みの問題に直面する可能性があります.GET_が使えますLOCK()は、現在常に1つのイベントのみが実行されていることを保証する.
  • イベントは接続スレッドには使用されず、独自のイベントスレッドがあり、実行後にキャッシュされずに破棄されます.SET CLOBALイベントを設定することでscheduler :=1;で開きます.

  • バインド変数
    これがJavaの中のPreparedStatementです.
    PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
    pstmt.setString(1, "Hi");
    for (int i = 0; i < 10; i++) {
    pstmt.setInt(2, i);
    int rowCount = pstmt.executeUpdate();
    }

    このような更新されたsql文は2つに分かれており、最初のステップはバンド?のsql文はサーバに送信されてプリコンパイルされます.2つ目のステップは、パラメータを設定して実行します.
    これには、次のようなメリットがあります.
  • 解析一次sql
  • 実行計画には、一部のキャッシュ
  • がある.
  • バイナリ方式はパラメータとハンドルを送信するだけで通信量を減らすもう一つのプリリリースSQLインタフェースバインド変数があり、これはよく言われない
  • 制限
  • セッションレベルの
  • 一度のSQLのみを実行する場合、バインド変数を使用すると通信のオーバーヘッドが1回以上発生します.
  • バインド変数を使用するリソースを解放することを忘れないでください.mysqlはこれに対して
  • オンラインがあるからです.
    SQL注入
    バインド変数を使用すると、SQL注入攻撃を防止できるという利点も追加できます.例えば、ログイン時に私たちのコードはこうです.
    String sql = "SELECT COUNT(*) FROM user WHERE username='"+ username+"' AND password ='"+ password +"';"
    //   password    ' OR '1'='1    sql    :
    // SELECT COUNT(*) FROM user WHERE username='wzj' AND password = '' OR '1'='1'true

    バインド変数を使用すると、この問題を効果的に回避できます.