>  기사  >  데이터 베이스  >  MySQL의 인덱스 및 트리거에 대한 자세한 설명

MySQL의 인덱스 및 트리거에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-30 11:04:052206검색

1》인덱스의 의미와 특징:

  인덱스란 무엇인가요? 병음으로 검색하려면 전체 사전을 탐색해야 합니다. 이 단어를 찾기 위해서는 병음에 따라 찾아보면 음성표 몇 페이지만 찾아보면 된다. 발음 순서를 통해 이 단어가 사전의 어느 페이지에 있는지 빠르게 알아낼 수 있습니다. 데이터베이스에서 인덱스는 테이블에 구축되며 데이터베이스의 쿼리를 크게 향상시키고 데이터베이스의 성능도 향상시킬 수 있습니다. 다양한 스토리지 엔진은 인덱스의 최대 길이와 인덱스 수를 정의합니다. 엔진은 각 테이블에 대해 최소 16개의 인덱스를 지원하며 인덱스 길이는 최소 256바이트를 지원합니다.



인덱스 이점:
종속 테이블 및 상위 테이블의 경우 데이터 검색 속도를 높일 수 있습니다. 종속 하위 테이블과 상위 테이블의 관계를 결합하여 쿼리 속도를 향상시킬 수 있습니다.
        인덱스의 단점:
                  인덱스를 생성하고 유지하는 데 시간이 걸리고 인덱스가 물리적 공간을 차지해야 합니다. 인덱스가 많으면 데이터 삽입에 영향을 미칩니다. 인덱스에 따라 데이터 삽입 속도가 향상됩니다.           해결 방법: 데이터를 삽입할 때 먼저 테이블의 인덱스를 일시적으로 삭제한 다음 데이터를 삽입하고 데이터 삽입이 완료된 후 인덱스를 생성하세요.


2》인덱스 분류:
 Mysql의 인덱스 유형에는 일반 인덱스, 고유 인덱스, 전체 텍스트 인덱스, 단일 열 인덱스, 다중 열 인덱스 및 공간 인덱스 등이 있습니다.

   1>Normal index
    일반 인덱스를 생성할 때 어떤 데이터 유형에도 제한 없이 이러한 인덱스를 생성할 수 있습니다.
2 & gt; 고유 인덱스
고유 인덱스를 생성하려면 고유 매개변수를 사용하여 인덱스 값을 설정해야 합니다. 유일한 사람이 되십시오. 예를 들어 학생 테이블에서 user_name 필드가 고유 인덱스로 설정된 경우 이 값은 고유해야 합니다.
          3> 전체 텍스트 색인                 전체 텍스트 색인으로 설정하려면 fulltext 매개변수를 사용하세요. 전체 텍스트 색인은 char varchar 또는 Text 유형의 필드에서만 생성될 수 있습니다. MyISAM 스토리지 엔진만이 이 인덱스를 지원합니다. > >                    아웃 아웃 아웃 아웃 4> 단일 열 인덱스는 일반 인덱스, 고유 인덱스 또는 전체 텍스트 인덱스일 수 있습니다. 인덱스가 하나의 필드에만 해당하는지 확인하세요.

5>다중 열 인덱스

다중 열 인덱스는 테이블의 여러 필드에 인덱스를 생성하며 생성 시 해당 필드를 가리킵니다. 이러한 필드를 통해 쿼리할 수 있습니다. 그러나 다중 열 인덱스를 사용하면 이러한 필드 중 첫 번째 필드를 쿼리할 때만 인덱스가 사용됩니다. 예: 테이블의 id, name 및 sex 필드에 다중 열 인덱스를 생성합니다. 그런 다음 다중 열 인덱스는 쿼리 조건이 인덱스를 사용하는 경우에만 사용되며 공간 인덱스는 기반으로만 구축될 수 있습니다. 현재 공간 인덱스는 MyISAM 스토리지 엔진을 통해서만 지원됩니다. 그리고 이 인덱스의 필드 값은 비워둘 수 없습니다.            연습: 다른 유형의 인덱스가 있는지 확인하세요.              해시 인덱스 기본 키 인덱스 B-트리 인덱스


3》인덱스 디자인 방법:
인덱스 사용을 보다 효율적으로 만들기 위해 인덱스를 생성할 때 해당 필드에 대한 인덱스 생성과 생성할 인덱스 유형을 고려해야 합니다.
 1>고유 인덱스 설정:
  고유 색인 값은 고유하며 이 색인을 통해 특정 레코드를 더 빠르게 확인할 수 있습니다.
         예: ID 번호가 고유하면 고유 색인을 생성할 수 있으며 이름이면 다음이 있을 수 있습니다. 동일한 이름의 상황이 발생하므로 쿼리 시간 속도가 줄어듭니다.
  2> 정렬, 그룹화 및 통합 작업이 자주 필요한 필드에 대한 인덱스 생성:
     별도별 그룹별 정렬 및 통합 작업과 같은 작업이 자주 필요한 필드의 경우 이러한 필드에 대한 인덱스를 생성하면 정렬 작업에 많은 시간이 낭비됩니다. , 정렬 작업을 효과적으로 방지할 수 있습니다.
​ 3> 쿼리 조건으로 자주 사용되는 필드에 대한 인덱스 만들기:
​ ​ ​ 필드가 쿼리 조건에 일반적으로 사용되는 경우 이 필드의 쿼리 속도가 속도에 영향을 미칩니다.
4>인덱스 수 제한:
각 인덱스에는 디스크 공간이 필요하므로 인덱스 수가 항상 더 좋은 것은 아닙니다. 인덱스가 많을수록 더 많은 디스크 공간이 필요하며, 인덱스를 재구성하고 업데이트하는 데 시간이 많이 소요됩니다.
5> 데이터:
인덱스 값이 매우 길면 쿼리 속도에 영향을 미칩니다. 예를 들어 Char(100) 유형 필드의 전체 텍스트 인덱싱은 char(10) 유형 필드보다 확실히 더 많은 시간이 걸립니다. ; 더 이상 사용되지 않거나 거의 사용되지 않는 인덱스 삭제:
            테이블의 데이터가 많이 업데이트되거나 데이터 사용 방식이 변경된 후에는 원래 인덱스 중 일부가 더 이상 필요하지 않을 수 있습니다. 이러한 인덱스를 삭제하여 업데이트 작업에 대한 인덱스의 영향을 줄입니다.

4》인덱스 생성 방법:

문법:
   [unique|fulltext|spatial] 색인 |key                                                       ~                       인덱스
          인덱스와 키는 인덱스에 대해 둘 중 하나를 선택하도록 필드를 지정하는 데 사용됩니다.

별칭 선택적 매개변수, 생성된 인덱스에 새 이름을 지정합니다.
  길이 옵션 매개변수는 인덱스의 길이를 지정합니다. 길이를 지정하려면 문자 유형이어야 합니다.
   ASC 오름차순, DESC 내림차순입니다. ; 1 & gt; 일반 인덱스 생성 R

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


인덱스가 포함된 ID를 일반 인덱스로 설정합니다.
                Mysql> show create table aatestG; 테이블의 세부 구조를 확인하세요
              Mysql> explain select * from aatest where id=1 G;


      2> 고유 색인 만들기
                                   ㅋㅋ

   3>전체 텍스트 색인 만들기                         ㅋㅋㅋ                    색인 생성 예정

     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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.