12-MySQLインデックスと外部キー

4352 ワード

索引
  • インデックスとは何ですか?インデックスは、あるカラムに特定の値を持つローをすばやく見つけるために使用されます.インデックスを使用しないでください.MySQLは、最初のレコードからテーブルを完全に読む必要があります.関連するローを見つけるまで、テーブルが大きいほど、データを検索するのにかかる時間が多くなります.テーブルにクエリーされたカラムにインデックスがある場合、MySQLはすべてのデータを表示する必要がなく、データファイルを検索する場所にすばやく到達することができます.そうすると、時間が大幅に節約されます.
  • MySQLにおけるインデックスの長所と短所と使用原則
  • の利点
  • すべてのMySqlフィールドはインデックス
  • として使用できます.
  • データの問合せ速度を大幅に高速化
  • 原則
  • クエリーでよく使用されるフィールドにインデックスを作成する必要があります.
  • データ量の小さいテーブルはインデックスを使用しないほうがいいです.インデックスは最適化されない可能性があります.


  • インデックス分類
  • 通常のインデックス:MySQLの基本インデックスタイプで、制限はありません.定義されたインデックスの列に重複値と空の値を挿入することができます.データのクエリーを高速化するためです.
  • 一意のインデックス(キーのみ):インデックス列の値は一意でなければなりませんが、NULL値を許可します.
  • プライマリ・キー・インデックス:特殊な一意のインデックスであり、NULL値は許可されません.
  • 具体的には、文書
  • を参照することができる.
       :
    create table test1(
        id int,
        name varchar(20),
        index idx_name(name) #    
    );
    
    create table test2(
        id int,
        name varchar(20),
    );
    create index idx_name on test2(name); #    
    
    create table test3(
        id int,
        name varchar(20),
    );
    alter table test3 add index idx_name(name);
    
       :
    create table test4(
        id int,
        name varchar(20),
        unique index idx_name(name) #    
    );
    
    create table test5(
        id int,
        name varchar(20),
    );
    create unique index idx_name on test5(name); #    
    
    create table test6(
        id int,
        name varchar(20),
    );
    alter table test6 add unique index idx_name(name);
    
    
    4.    
    drop index idx_name on test6
    

    データ整合性
  • エンティティ整合性(行の整合性)1行のデータが完全であるかどうかは、複数のデータが同じであれば区別できない、エンティティ不完全
  • と呼ぶ.
    name score
    lnj  100
    lnj  100
    
        :
    -       
    id name score
    1  lnj  100
    2  lnj  100
    
    -        
    name score
    lnj  100
    zq  100
    
    -      
    id name score
    1  lnj  100
    2  lnj  100
    
  • ドメイン整合性(カラム整合性)あるカラムデータが完全であるかどうか、nullが発生した場合、一致しないデータはいずれも不完全である
  • を表す.
    id name score
    1   lnj  100
    2   zq   null
    2   zq   tyt
    
    -       
    id name score
    1   lnj  100
    2   zq   null
    2   zq   0
    
        :
    
    -     
    id name score
    1   lnj  100
    2   zq   0
    2   zq   0
    
    -      
    id name score
    1   lnj  100
    2   zq   59.5
    2   zq   0
    
  • 参照整合性デフォルトでは複数のテーブルの間には何の関係もないので、Aテーブルには任意にデータを挿入することができ、Bテーブルには任意にデータを挿入することができ、例えば1枚の学生テーブルと1枚の成績テーブルがあり、成績テーブルに保存されているのは学生テーブルの各学生の成績
    +     
      +    id      name
      +     1       lnj
      +     2       zq
    
      +    
      +     id      stuid     score
      +     1         1         100
      +     2         3         99
      +     3         2         86
    
    でなければならない.
  • は、外部キー制約によりテーブルとテーブルの関係を追加することができ、MySQLがデータを挿入する際に、依存するデータが存在するかどうかをチェックしてこそ挿入できることをMySQLに伝えることができる.


  • 外部キー
  • 外部キーとは何ですか?あるテーブルのフィールドが別のテーブルのプライマリ・キーを参照している場合、このフィールドは外部キー
  • と呼ばれます.
      :      stuid        id,   stuid        
       :       stuid        id,           "  ",         
    
       :
    create table stugrade2(
        id int auto_increment primary key,
        stuid int,
        score float,
        #  MySQL stuid    ,     stuinfo  id
        foreign key(stuid) references stuinfo(id)
    );
    insert into stugrade2 values(null, 3, 100); #  ,   sutinfo   id 3  
    insert into stuinfo values(null, 'lnj');
    insert into stugrade2 values(null, 3, 100); #  ,   sutinfo   id 3  
    insert into stugrade2 values(null, 1, 100);
    delete from stuinfo where id=1; #  ,              
    
  • 外部キーの特徴
  • メインテーブルには対応するデータがない、テーブルから挿入できない、挿入後もデータが不完全であるため
  • .
  • このプライマリ・テーブルのデータをテーブルから参照すると、プライマリ・テーブルはそのデータを削除できません.削除後もデータが不完全であるためです.
  • 外部キーshow create table stugrade3\G;
  • を表示
  • 外部キーalter table stugrade3 drop foreign key stugrade3_ibfk_1;
  • を削除する.
  • 外部キーに関する動作
  • -     (  )
        +           ,        
        +           ,       
        +           ,       
    -     
        +             ,           null,           
        +   :    id 1      ,       stuid  null
    -     
        +          ,        ,           
        +   :    'lnj' id 1  3,       stuid  1  3
    
    -   :
         foreign key(  ) references    (    )[       ][       ]
    
       :
    create table stugrade(
        id int auto_increment primary key,
        stuid int,
        score float,
        #   :                ,        
        foreign key(stuid) references stuinfo(id) on delete set null on update cascade
    );
    insert into stugrade values(null, 1, 100);
    update stuinfo set id=666 where id=1;
    delete from stuinfo where id=666;