집 >데이터 베이스 >MySQL 튜토리얼 >MySQL의 인덱스 및 트리거에 대한 자세한 설명
1》인덱스의 의미와 특징:
인덱스란 무엇인가요? 병음으로 검색하려면 전체 사전을 탐색해야 합니다. 이 단어를 찾기 위해서는 병음에 따라 찾아보면 음성표 몇 페이지만 찾아보면 된다. 발음 순서를 통해 이 단어가 사전의 어느 페이지에 있는지 빠르게 알아낼 수 있습니다. 데이터베이스에서 인덱스는 테이블에 구축되며 데이터베이스의 쿼리를 크게 향상시키고 데이터베이스의 성능도 향상시킬 수 있습니다. 다양한 스토리지 엔진은 인덱스의 최대 길이와 인덱스 수를 정의합니다. 엔진은 각 테이블에 대해 최소 16개의 인덱스를 지원하며 인덱스 길이는 최소 256바이트를 지원합니다.
인덱스 이점:
종속 테이블 및 상위 테이블의 경우 데이터 검색 속도를 높일 수 있습니다. 종속 하위 테이블과 상위 테이블의 관계를 결합하여 쿼리 속도를 향상시킬 수 있습니다.
인덱스의 단점:
인덱스를 생성하고 유지하는 데 시간이 걸리고 인덱스가 물리적 공간을 차지해야 합니다. 인덱스가 많으면 데이터 삽입에 영향을 미칩니다. 인덱스에 따라 데이터 삽입 속도가 향상됩니다. 해결 방법: 데이터를 삽입할 때 먼저 테이블의 인덱스를 일시적으로 삭제한 다음 데이터를 삽입하고 데이터 삽입이 완료된 후 인덱스를 생성하세요.
2》인덱스 분류:
Mysql의 인덱스 유형에는 일반 인덱스, 고유 인덱스, 전체 텍스트 인덱스, 단일 열 인덱스, 다중 열 인덱스 및 공간 인덱스 등이 있습니다.
1>Normal index
일반 인덱스를 생성할 때 어떤 데이터 유형에도 제한 없이 이러한 인덱스를 생성할 수 있습니다.
2 & gt; 고유 인덱스
고유 인덱스를 생성하려면 고유 매개변수를 사용하여 인덱스 값을 설정해야 합니다. 유일한 사람이 되십시오. 예를 들어 학생 테이블에서 user_name 필드가 고유 인덱스로 설정된 경우 이 값은 고유해야 합니다.
3> 전체 텍스트 색인 전체 텍스트 색인으로 설정하려면 fulltext 매개변수를 사용하세요. 전체 텍스트 색인은 char varchar 또는 Text 유형의 필드에서만 생성될 수 있습니다. MyISAM 스토리지 엔진만이 이 인덱스를 지원합니다. > > 아웃 아웃 아웃 아웃 4> 단일 열 인덱스는 일반 인덱스, 고유 인덱스 또는 전체 텍스트 인덱스일 수 있습니다. 인덱스가 하나의 필드에만 해당하는지 확인하세요.
다중 열 인덱스는 테이블의 여러 필드에 인덱스를 생성하며 생성 시 해당 필드를 가리킵니다. 이러한 필드를 통해 쿼리할 수 있습니다. 그러나 다중 열 인덱스를 사용하면 이러한 필드 중 첫 번째 필드를 쿼리할 때만 인덱스가 사용됩니다. 예: 테이블의 id, name 및 sex 필드에 다중 열 인덱스를 생성합니다. 그런 다음 다중 열 인덱스는 쿼리 조건이 인덱스를 사용하는 경우에만 사용되며 공간 인덱스는 기반으로만 구축될 수 있습니다. 현재 공간 인덱스는 MyISAM 스토리지 엔진을 통해서만 지원됩니다. 그리고 이 인덱스의 필드 값은 비워둘 수 없습니다. 연습: 다른 유형의 인덱스가 있는지 확인하세요. 해시 인덱스 기본 키 인덱스 B-트리 인덱스 3》인덱스 디자인 방법: 4》인덱스 생성 방법: 문법: 3>전체 텍스트 색인 만들기 ㅋㅋㅋ 색인 생성 예정 4>创建单列索引 5>创建多列索引 5》在已经有的表上建立索引: 2>创建唯一索引 3>创建全文索引 4>创建单列索引 5>创建多列索引 如果没有别名,+索引名称 触发器(trigger)是由事件来触发某个操作,主要是由insert update delete等事件来触发某种特定的条件,满足触发器的触发条件时,数据库就会执行触 发器定义的程序语句,比如:当学生表当中增加了一个学生记录,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录。 语法: 2》创建触发器 1>创建一个表alvin 2>创建一个表为trigger_time用来存放触发后条件的结果 3>创建只有单个执行语句的触发器 4>创建有多个执行语句的触发器 举例二、 然后开始创建一个触发器 看看before和after的区别 3》查看触发器: 1> 查看所有触发器,提前要进入某库 4》删除触发器: 语法:
인덱스 사용을 보다 효율적으로 만들기 위해 인덱스를 생성할 때 해당 필드에 대한 인덱스 생성과 생성할 인덱스 유형을 고려해야 합니다.
1>고유 인덱스 설정:
고유 색인 값은 고유하며 이 색인을 통해 특정 레코드를 더 빠르게 확인할 수 있습니다.
예: ID 번호가 고유하면 고유 색인을 생성할 수 있으며 이름이면 다음이 있을 수 있습니다. 동일한 이름의 상황이 발생하므로 쿼리 시간 속도가 줄어듭니다.
2> 정렬, 그룹화 및 통합 작업이 자주 필요한 필드에 대한 인덱스 생성:
별도별 그룹별 정렬 및 통합 작업과 같은 작업이 자주 필요한 필드의 경우 이러한 필드에 대한 인덱스를 생성하면 정렬 작업에 많은 시간이 낭비됩니다. , 정렬 작업을 효과적으로 방지할 수 있습니다.
3> 쿼리 조건으로 자주 사용되는 필드에 대한 인덱스 만들기:
필드가 쿼리 조건에 일반적으로 사용되는 경우 이 필드의 쿼리 속도가 속도에 영향을 미칩니다.
4>인덱스 수 제한:
각 인덱스에는 디스크 공간이 필요하므로 인덱스 수가 항상 더 좋은 것은 아닙니다. 인덱스가 많을수록 더 많은 디스크 공간이 필요하며, 인덱스를 재구성하고 업데이트하는 데 시간이 많이 소요됩니다.
5> 데이터:
인덱스 값이 매우 길면 쿼리 속도에 영향을 미칩니다. 예를 들어 Char(100) 유형 필드의 전체 텍스트 인덱싱은 char(10) 유형 필드보다 확실히 더 많은 시간이 걸립니다. ; 더 이상 사용되지 않거나 거의 사용되지 않는 인덱스 삭제:
테이블의 데이터가 많이 업데이트되거나 데이터 사용 방식이 변경된 후에는 원래 인덱스 중 일부가 더 이상 필요하지 않을 수 있습니다. 이러한 인덱스를 삭제하여 업데이트 작업에 대한 인덱스의 영향을 줄입니다.
[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> 고유 색인 만들기 ㅋㅋ
create table aatest4(
id int,
subject varchar(30),
index aatest4_st(subject(10)));subject(10)指定索引的长度
多列索引,是在表上多个字段创建一个索引。
create table aatest5(
id int,
name varchar(20),
sex char(4),
index aatest5_ns(name,sex));
语法:
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);
create unique index zytest1_id on zytest1(id);
alter table zytest1 add unique index zytest1_id(id);
create fulltext index zytest2_id on zytest2(info);
alter table zytest2 add fulltext zytest_2(info);
create index zytest3_addr on zytest3(address(4));
alter table zytest3 add index zytest3_addr(address(4));
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》触发器的含义与作用:
就执行一次计算学生的总数量的操作。这可以保证每次增加学生后的记录统计一直保持最新;触发器触发的执行语句可以只有一个。也可能有多个;
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表当中。
create table alvin(
userid int(10),
username varchar(20),
old int(4),
address varchar(30));
create table trigger_time(
zhixing_time time);
Query OK, 0 rows affected (0.15 sec)
create trigger alvin1 before insert
on alvin for each row
insert into trigger_time values(now());
Query OK, 0 rows affected (0.07 sec)
举例一、
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 ;
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;查看触发器统计的结果。
#: 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;
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!