ホームページ  >  記事  >  データベース  >  MySQLのインデックスとトリガーの詳しい説明

MySQLのインデックスとトリガーの詳しい説明

黄舟
黄舟オリジナル
2017-09-30 11:04:052150ブラウズ

1》インデックスの意味と特徴:

インデックスとは何ですか? インデックスは、例えば、単語「star」を検索した場合、それが見つからない場合に使用します。ピンインの場合は、辞書全体を調べてクエリする必要があります。この単語を見つけるには、ピンインに従って検索すれば、数ページの発音表を調べるだけで済みます。この単語が辞書のどのページに載っているかを発音順からすぐに調べることができます。データベースでは、インデックスはテーブル上に構築されます。インデックスはデータベースのクエリを大幅に改善し、さまざまなストレージ エンジンによってインデックスの最大長とストレージの数が定義されます。エンジンは各テーブルに対して少なくとも 16 個のインデックスをサポートし、インデックスの長さは少なくとも 256 バイトをサポートします。



インデックスの利点:
その利点により、依存関係のあるサブテーブルと親テーブルのデータの取得速度が向上します。依存サブテーブルと親テーブルの関係を統合すると、結合クエリを実行する際のクエリ速度が向上します。
インデックスの欠点:
インデックスの作成と維持には時間がかかり、各インデックスが一定量の物理スペースを占有する必要があるため、データベース システムの並べ替えに影響します。インデックスに応じてデータの挿入速度が向上します。 解決策: データを挿入するときは、まずテーブルのインデックスを一時的に削除してからデータを挿入し、データの挿入が完了した後にインデックスを作成します。

2》インデックスの分類:
Mysqlのインデックスタイプには、通常のインデックス、一意のインデックス、全文インデックス、単一列インデックス、複数列インデックス、空間インデックスなどがあります

1>通常;インデックス
通常のインデックスを作成する場合、いかなる制限もなく、そのようなインデックスは任意のデータ型で作成できます。
2 & gt; ユニークなインデックス
ユニークなインデックスを作成する場合は、インデックスの値を指定する必要があります。唯一のものであってください。たとえば、student テーブルで user_name フィールドが一意のインデックスとして設定されている場合、この値は一意である必要があります。
3> フルテキスト インデックス
fulltext パラメーターを使用して、フルテキスト インデックスを設定します。フルテキスト インデックスは、char varchar または Text タイプのフィールドにのみ作成できます。 MyISAM ストレージ エンジンのみがこのインデックスをサポートしています。 .Mysql5.6 InnoDB はフルテキスト インデックスのサポートを開始しました 4 & gt; 単一列インデックス
単一列インデックスは、テーブル内の単一フィールドにのみ基づいて作成されます。単一列インデックスは、通常のインデックス、一意のインデックス、またはフルテキスト インデックスのいずれかになります。インデックスが 1 つのフィールドにのみ対応することを確認してください。

5>複数列インデックス 複数列インデックスは、テーブルの複数のフィールドにインデックスを作成し、作成時に対応するフィールドを指します。これらのフィールドを通じてクエリを実行できます。ただし、複数列インデックスを使用すると、これらのフィールドの最初のフィールドをクエリする場合にのみインデックスが使用されます。例: テーブル内の ID、名前、性別フィールドに複数列インデックスを作成すると、クエリ条件で ID フィールドが使用される場合にのみ複数列インデックスが使用され、空間インデックスのみが構築されます。現在、空間インデックスは MyISAM ストレージ エンジンを使用した場合のみサポートされています。また、このインデックスのフィールド値を空にすることはできません。
演習: 他の種類のインデックスがあるかどうかを確認してください。
ハッシュ インデックス 主キー インデックス B ツリー インデックス


3》インデックスの設計方法:
インデックスの使用をより効率的にするために、インデックスを作成するときに、それらのフィールドにインデックスを作成することと、作成するインデックスの種類を考慮する必要があります;
1>一意のインデックス設定:
一意のインデックス 値は一意であり、このインデックスを通じて特定のレコードをより迅速に決定できます
例: ID 番号は一意であり、一意のインデックスを作成できます。名前の場合は、同じ名前のシチュエーションが存在するため、クエリ時間の速度が低下します。
2> 並べ替え、グループ化、結合操作が頻繁に必要なフィールドのインデックスを作成します。
並べ替え操作、個別のグループ化、結合などの操作が頻繁に必要なフィールドの場合、これらのフィールドのインデックスを作成すると、並べ替え操作に多くの時間がかかります。並べ替え操作を効果的に回避できます。
3> クエリ条件としてよく使用されるフィールドのインデックスを作成します。
フィールドがクエリ条件によく使用される場合、このフィールドのクエリ速度が影響します。テーブル全体のクエリ速度を向上させます。
4>インデックスの数を制限します。
各インデックスにはディスク容量が必要なため、インデックスの数が必ずしも良いとは限りません。インデックスが増えると、より多くのディスク容量が必要になります。インデックスの更新が増えると、インデックスの更新に時間がかかります。
5>データの数:
インデックス値が非常に長い場合、クエリ速度に影響します。たとえば、Char(100) 型フィールドの全文インデックス作成は、char(10) 型フィールドよりも確実に時間がかかります。 ; 使用されなくなったインデックス、またはめったに使用されないインデックスを削除します:
テーブル内のデータが頻繁に更新されたり、データの使用方法が変更されたりした後は、元のインデックスの一部が不要になる可能性があります。DBA は定期的に見つける必要があります。これらのインデックスを削除して、更新操作に対するインデックスの影響を軽減します。

4》インデックスの作成方法:

文法:
[一意| FullText | Spatial]インデックス|keyインデックス
indexとキーは、インデックスの2つのいずれかを選択するフィールドを指定するために使用されます。
Alias オプションのパラメーター。作成されたインデックスに新しい名前を付けます。
length オプションのパラメーターはインデックスの長さを指定します。長さを指定するには文字型である必要があります。
ASC昇順、DESC降順。 ; 1 & gt; ID を通常のインデックスとして設定するための通常のインデックス


 Mysql->create table aatest(
                                 id int,
                                 name varchar(20),
                                 sexboolean,
                                 index(id));

を作成します。

Mysql> show create table aatestG; テーブルの詳細な構造を確認します Mysql> Explain select * from aatest where id=1 G; インデックスが使用されているかどうかを確認します。

2&gt

create table aatest2(
                                          id int unique,
                                            name varchar(20),
                                          unique index aatest_id(id ASC));


インデックスに登録されます

     4>创建单列索引
                   

 create table aatest4(
                                                     id int,
                                                      subject varchar(30),
                                                     index aatest4_st(subject(10)));subject(10)指定索引的长度


               5>创建多列索引
                   多列索引,是在表上多个字段创建一个索引。
                   

  create table aatest5(
                                                       id int,
                                                         name varchar(20),
                                                       sex char(4),
                                                       index aatest5_ns(name,sex));


5》在已经有的表上建立索引:
       语法:
          create [unique | fulltext | spatial ] index 索引名
          on  表名 (属性名 [(长度)] [ ASC | DESC]);

          alter table 表名 ADD [unique | fulltext | spatial ] index 索引名
          (属性名 [(长度)] [ ASC | DESC]);

          1>创建普通索引
                

create index zytest_id  on zytest(id);
                 alter table zytest add index zytest_id(id);

          2>创建唯一索引                

create unique index zytest1_id on zytest1(id);
                 alter table zytest1 add unique index zytest1_id(id);

          3>创建全文索引            

 create fulltext index zytest2_id on zytest2(info);
                 alter table zytest2 add fulltext zytest_2(info);

              4>创建单列索引              

create index zytest3_addr on zytest3(address(4));
                 alter table zytest3 add index zytest3_addr(address(4));

          5>创建多列索引
                

create index zytest4_na on zytest4(name,address);
                 alter table zytest4 add index zytest4_na(name,address);
6》如何删除索引:


       如果没有别名,+索引名称
       语法:drop index 索引名 ON 表名
             drop indexid on zytest;

        如果有别名的话。直接+索引别名
        语法:drop index 索引别名 ON 表名

================触发器:

1》
触发器的含义与作用

            触发器(trigger)是由事件来触发某个操作,主要是由insert update delete等事件来触发某种特定的条件,满足触发器的触发条件时,数据库就会执行触     发器定义的程序语句,比如:当学生表当中增加了一个学生记录,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录。
   就执行一次计算学生的总数量的操作。这可以保证每次增加学生后的记录统计一直保持最新;触发器触发的执行语句可以只有一个。也可能有多个;

         语法:
            create trigger 触发器名称  before|after 触发事件
            on 表名 for each row 执行语句
            berfore指触发事件之前执行的触发语句。
            After 表示在触发事件之后执行语句
            触发事件包括(insert update delete)等
            on表名在XXX表之上
            执行语句指的是XXSQL语句和触发事件类型要对应

          A  触发器  B存放A总记录,
          当A表删除一条数据之后--->触发器将统计的最终结果写入到B表当中,用户每次想要得到A表的结果,只需要去B表当中查询就行了。
           select count(*) from A >B表当中。

2》创建触发器

         1>创建一个表alvin
                

create table alvin(
                     userid int(10),
                     username varchar(20),
                     old int(4),
                     address varchar(30));

         2>创建一个表为trigger_time用来存放触发后条件的结果
                 

create table trigger_time(
                       zhixing_time time);
                  Query OK, 0 rows affected (0.15 sec)

         3>创建只有单个执行语句的触发器
                 

create trigger alvin1 before insert
                       on alvin for each row
                   insert into trigger_time values(now());
                   Query OK, 0 rows affected (0.07 sec)


        4>创建有多个执行语句的触发器

         举例一、
              root@zytest 10:49>delimiter &&#告诉MYSQL该命令段下面的内容在提示结束后再执行分析。默认是以分号(;)执行
     

 root@zytest 10:53>create trigger alvin3 after delete             
 ->on alvin for each row               
 -> begin             
 ->insert into trigger_time values('21:01:01');             
 ->insert into trigger_time values('22:01:01');              
 ->end                 
 ->&&     Query OK, 0 rows affected (0.05 sec)
             root@zytest 10:54>delimiter;#结束退出,注意分号要有空格    
             root@zytest 10:57>select * from alvin;    
             +--------+-------------+------+----------+    
             | userid | username    | old  | address  |    
             +--------+-------------+------+----------+    
             |    110 | zengxiaohua |   28 | tianxing |    
             +--------+-------------+------+----------+    
             1 row in set (0.00 sec)
             root@zytest 11:07>delete from alvin where userid='110';#执行删除动作看看触发器是否成功    
             Query OK, 1 row affected (0.05 sec)    
             root@zytest 11:07>select * from trigger_time;#:查看触发器的执行结果      
             +--------------+      
             | zhixing_time |      
             +--------------+      
             | 19:09:41     |      
             | 21:01:01     |      
             | 22:01:01     |      
             +--------------+    
             3 rows in set (0.00 sec)


     举例二、
    alvin1表存放了学生的信息。每次增加(insert)一个学生的信息。就触发一次统计。统计结果存入aac表里面;
    首先创建一个alvin1表结构
      

create table alvin1(
          user_id int(10),
          username varchar(20),
          old tinyint(4),
          address varchar(30));
      create table aac(
          my_count int);

    然后开始创建一个触发器
      

delimiter&&
      create trigger alvin123 before insert on
      alvin1 for each row begin
      declare ycount int(10);#:申明变量类型
      set ycount=(select count(*) from alvin1);#:给变量赋值
      insert into aac(my_count) values(ycount);#:调用变量
      end&&
      delimiter ;


  看看before和after的区别
    

create trigger alvin123 after insert on
      zyalvin1 for each row
      begin
      declare ycount int(10);
      set ycount=(select count(*) from zyalvin1);
      insert into aac(my_count)values(ycount);
      end&&
    root@zytest 16:24>insert into alvin1 values('1001','zhangsan','18','China');开始测试
    root@zytest 16:24>select * from aac;查看触发器统计的结果。


3》查看触发器

      1> 查看所有触发器,提前要进入某库
             #: show triggers \G;

      2>在triggers表中查看触发信息
             root@zytest 11:20>use information_schema;
             root@zytest 11:19>select * from information_schema.triggers \G;
           小技巧:所有触发器的信息都存在information_schema库中的triggers表里面,在使用select 查询单个触发器的时候。可以根据triggers表里面的字段名称
               Trigger_name字段进行查询。
             root@information_schema 11:24>select * from triggers where trigger_name='alvin1'\G;

  4》删除触发器

  语法:
         1>删除alvin1触发器
               

 root@(none) 12:18>use zytest;
                   Database changed
                 root@zytest 12:18>drop trigger alvin1;
                 Query OK, 0 rows affected (0.03 sec)


 

以上がMySQLのインデックスとトリガーの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。