スロービュー、トリガ、トランザクション、ストアドプロシージャ、ファンクション、プロセスコントロール、インデックス作成とクエリの最適化

ビュー

それが図である何1

見るだけで、予約テーブル構造を保存し、クエリのSQLステートメントの結果は、仮想テーブルを取得している、このビューは、仮想テーブルです

2、なぜ見る必要があります

スプライシングテーブルを消費する時間を節約するために後半に直接お問い合わせを容易にするために

3、どのように表示して

構文:SQL文としてビュービュー名を作成

作成 ビュー class_studentをとして 選択 *  からクラス内部 の参加学生を class.cid = student.class_id。

 

 

注: 1、元のテーブルからのビューのうちのテーブル構造を作成するだけ、データテーブル、またはデータ

2.直接テーブルに元のデータに影響を与える、データビューを変更しない、クエリに対してのみ表示

一般的な開発作業、無ビュー、後者はビューの機能を拡張したかったので、変更し、その後、プログラムを修正する必要のある手段、変更する必要がmysqlのビュー内の部門間のコミュニケーションニーズ、一般的に全て表示していないだろう

 

第二に、フリップフロップ

1、トリガーは何ですか

いくつかの操作では、削除、追加、特定のテーブルのデータを変更するには、自動的にトリガ、フリップフロップと呼ばれます

2、なぜトリガーします

インサートによってテーブルにデータは、削除、変更の更新を削除すると、そのような行動は、SQLコードの実行をトリガするためにトリガされた後

あなたは追加することができます/削除/変更を、後/前にトリガをトリガ

完全な構文:作成 トリガーの前にトリガー名を/INSERT / 削除/ 更新 のための各行が
 始まります
    SQL文...
終わり

注:トリガー名、アンダースコア本体の最良の使用を命名、そのように、イタリアの名前を知っている参照してください。tri_before_insert_t1

デフォルトの区切り文字$$#mysqlのAターミネータ; $$置き換えます

挿入のために#
各行の名表に挿入した後にトリガtri_after_insert_t1を作成します
ベギン
    SQLコード。
終わり 
各行の名表に挿入する前にトリガtri_before_insert_t2を作成します
ベギン
    SQLコード。
終わり

削除のために#
行ごとの名表に削除した後、トリガーtri_after_delete_t1を作成
ベギン
    SQLコード。
終わり
削除の前にトリガtri_before_delete_t2を作成する表名、行ごとに
ベギン
    SQLコード。
終わり

#への変更
各行の名表に対する更新後トリガーtri_after_update_t1を作成します
ベギン
    SQLコード。
終わり
各行の名表に更新前トリガtri_before_update_t2を作成します
ベギン
    SQLコード。
終わり

ケース#
(TABLE cmdをCREATE
    ID INT PRIMARY KEYのAUTO_INCREMENT、
    ユーザーCHAR(32)、
    PRIV CHAR(10)
    cmdをCHAR(64)、
    sub_time日時、#は時間をコミット
    成功の列挙型(「はい」、「いいえ」)#0は、失敗した実行を表し、
);

(表ERRLOGをCREATE
    ID INT PRIMARY KEYのAUTO_INCREMENT、
    err_cmd CHAR(64)、
    err_time日時
);

デフォルトの区切り文字$$#mysqlのAターミネータ; $$置き換えます
各行のCMDに挿入後トリガtri_after_insert_cmdを作成します
ベギン
    NEW.success場合=「NO」その後、#MySQLは新しいレコードがオブジェクトNEWにカプセル化されません
        ERRLOG(err_cmd、err_time)値(NEW.cmd、NEW.sub_time)に挿入します。
    場合は終了。
最後$$
区切り文字;終了後の#が戻ってそれを変更することを忘れない、またはターミネータは背面にある$$

テーブルCMDにレコードを挿入#、火災のトリガ、IFの条件でエラーログを挿入するかどうかを決定
INSERT INTOは、cmdを(
    ユーザー、
    PRIV、
    CMD、
    sub_time、
    成功
VALUES
    ( 'エゴン'、 '0755'、 'のls -lの/ etc'、NOW()、 'はい')、
    ( 'エゴン'、 '0755'、 '猫/ etc / passwdファイル'、NOW()、 'いいえ')、
    ( 'エゴン'、 '0755'、 'useraddのXXX'、NOW()、 'いいえ')、
    ( 'エゴン'、 '0755'、 'psの補助'、NOW()、 'はい')。

#クエリテーブルのレコードERRLOG
ERRLOGから*を選択します。
#削除トリガー
トリガーtri_after_insert_cmdをドロップします。

  

第三に、トランザクション

1.トランザクションとは何ですか

同時にいくつかのSQLステートメント、SQL文を含むいずれかのアトミックのトランザクションと呼ばれ、データのセキュリティ動作の一貫性を確保するために、同時に成功するか失敗する可能性がトランザクションを開きます

2、なぜすべき取引

データ操作のセキュリティを確保するために、

トランザクションの3、4つのACIDプロパティ

原子性:トランザクションがデータ上のさまざまな操作が含まれ、操作はどちらか成功するか失敗しています

一貫性:別の一貫性のある状態に一貫性のある状態から一貫とアトミック密接に関連して、トランザクション・データベースを変更

分離:別のトランザクションでのトランザクションの動作データ及び操作データが分離され、非干渉

永続(パーマネント):永久的な変化を提出したトランザクションが発生すると

トランザクションを使用する方法4、

#最初のオープン・トランザクション操作の前にデータを変更します。
トランザクションを開始。

#変更操作
更新ユーザ設定バランス= 20000000どこ名=「ミスター沈」; 

以前の状態に#ロールバック
ロールバック;

#取引後のオープンは、コミット操作しない限り、データは実際には本当にハードディスクにフラッシュされていません
#コミット操作
コミット;
「」「」「オープン総務検出動作は、コミット操作が完了する必要があります。不完全、以前の状態にロールバックするためのイニシアチブをとる、完了です」

  

第四に、ストアドプロシージャ

カスタム関数の同等:

パッケージ一連のSQL文の中では、MySQLの操作は、ストアドプロシージャを呼び出すことにより、データベースを操作する、または呼び出し元の便宜のためにできることはできません。

構文:

参照番号があります。
区切り文字$$
(手続きP1を作成します
    m個のint型では、このパラメータに#が示さなければならないだけで返すことができないうち合格
    nはint型で、  
    解像度INT#うちからすると、このパラメーターが出て返すことができ、また、リターンを渡すことができinoutの表現があることを示します
ベギン
    教師TID> MとTIDからTNAMEを選択<N。
    セットRES = 0。
最後$$
デリミタ;
#なし引数
区切り文字$$
プロシージャP1を作成します()
ベギン
    ユーザーから*を選択します。
最後$$
デリミタ;

  

どのように使用するには:

MySQLで直接呼び出さ#1、
セット@ RES = 10の#RES値は、ストアドプロシージャが正常に基づいて行われているかどうかを決定するために使用され、可変メモリ10 @resを定義する必要があります
コールP1(2,4,10-);#エラー
コール(RES @ 2,4、)P1;  

#結果の表示
@resを選択します。#は、RES @変数の値が変更され、正常に実行

#2、Pythonでプログラムを呼び出します
pymysqlリンクのmysql
ランテーブルcursor.callproc内部原理( 'P1'、(2,4,10-))#生成:@_ P1_0 = 2、@ _ P1_1 = 4、@ _ P1_2 = 10。
cursor.excute( '@ _p1_2を選択;')

V.機能

ストアドプロシージャとの違いに注意して、組み込み関数MySQLはSQL文でのみ使用することができます

(表ブログを作成します
    ID INT PRIMARY KEYのAUTO_INCREMENT、
    NAME CHAR(32)、
    sub_time日時
);

INSERT INTOブログ(NAME、sub_time)
VALUES
    (「オン」、「2015年3月1日午前11時31分21秒」)、
    ( 'パート2'、 '2015年3月11日午後4時31分21秒')、
    (3 'で'、 '2016年7月1日午前10時21分31秒')、
    ( '第4'、 '2016年7月22日午前9時23分21秒')、
    (「第5」、「2016年7月23日十時11分11秒」)。

DATE_FORMAT(sub_time、 '%Y-%M')でブログ群からDATE_FORMAT(sub_time、 '%Y-%M')、カウント値(ID)を選択します。

第六に、プロセス制御

条件文の場合#
区切り文字//
PROCEDUREのproc_ifをCREATE()
ベギン
    私は0をデフォルトのint宣言。
    私は、1 IF =
        1を選択します。
    私は2 THEN = ELSEIF
        2を選択します。
    ELSE
        7を選択します。
    END IF;

終わり //
区切り文字;
#whileループ
区切り文字//
PROCEDUREのproc_whileをCREATE()
ベギン
    int型かどうかを宣言します。
    セットNUM = 0;
    WHILE NUM <10 DO
        SELECT
            NUM;
        セットNUM = NUM​​ + 1;
    ENDのWHILE;
終わり //
区切り文字;

  

七、インデックスとスロークエリの最適化

データは、IO操作の必要性についての問合せデータのハードディスク上に存在します

インデックス MySQLではとも呼ばれるキー、レコードを検索するために、高速エンジンのためのデータ構造体に格納されているディレクトリなどの本れます

3つのインデックスがあります。

  • 主キー
  • uinqueキー
  • インデックスキー

注:外部キーは、クエリのスピードアップするために使用されていない、と私たちは(キーの3種類の前に2つの加速クエリ結果だけでなく、追加の制約上記に加えて、研究の範囲に含まれない主キー:空でないとのみ、ユニークキー:のみ)、任意の制約関数なしのインデックス・キーを使用して、クエリをスピードアップするのに役立ちますしながら、

基本的に:あなたが欲しい、最終的な結果を取得したいデータの継続的な狭い範囲を通してフィルタに、ランダムイベントは、このインデックス機構と、言うことであるイベントの順序となっている間、私たちは常に使用することができます同じデータをロックする方法を見つけます。

B +ツリー

 

 

リーフノードのみが実際のデータを格納し、根と枝ノードは、仮想データが存在します

階層決定木でのお問い合わせの数、あまり頻繁に、レベルを下げます

ディスクは、小片の大きさは、特定の手段で格納できるデータの一定量です。木のそれの最低レベルを確保するには?

  • インデックスフィールドを小さくします
  • 左端の屈折率整合特性

クラスタ化インデックスは:テーブルの主キーを参照し、テーブル内の指定されたInnoDBエンジンは、主キーを持っている必要があります

セカンダリインデックス:全てのスクリーニングのid条件として使用することはできませんクエリデータは、また、情報等のフィールド名、パスワードを使用することができる、そしてあなたは、クエリのパフォーマンスクラスタ化インデックスをスピードアップするために、この時間を使用することはできません。これは、これらのインデックスがセカンダリインデックスと呼ばれ、他のフィールドにインデックスを作成する必要があります

ユーザー名=「ミスター沈」から名前を選択します。

上記のステートメントが呼び出され、被覆指数:セカンダリインデックスのリーフノードのみが私たちが望むすべてのデータを発見しました

ユーザー名=「ミスター沈」から年齢を選択します。

上記の文は、呼ばれている非カバーインデックスを、インデックスがクエリのフィールド名を打ったとき、しかし、それはマスターキーを使用して、それを見つける必要があるので、年齢のフィールドかどうかを確認します

名前がインデックスの場合、名前を直接使用することは=される「ミスターシェン」、インデックスを打つには、名前によって直接でない場合は、ある非インデックスヒット

おすすめ

転載: www.cnblogs.com/lvguchujiu/p/12056383.html