ホームページ >データベース >mysql チュートリアル >MySQLのインデックスとトリガーの詳しい説明
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 ストレージ エンジンを使用した場合のみサポートされています。また、このインデックスのフィールド値を空にすることはできません。 3》インデックスの設計方法: 4》インデックスの作成方法: 文法: Mysql> show create table aatestG; テーブルの詳細な構造を確認します Mysql> Explain select * from aatest where id=1 G; インデックスが使用されているかどうかを確認します。 2&gt 4>创建单列索引 5>创建多列索引 5》在已经有的表上建立索引: 2>创建唯一索引 3>创建全文索引 4>创建单列索引 5>创建多列索引 如果没有别名,+索引名称 触发器(trigger)是由事件来触发某个操作,主要是由insert update delete等事件来触发某种特定的条件,满足触发器的触发条件时,数据库就会执行触 发器定义的程序语句,比如:当学生表当中增加了一个学生记录,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录。 语法: 2》创建触发器 1>创建一个表alvin 2>创建一个表为trigger_time用来存放触发后条件的结果 3>创建只有单个执行语句的触发器 4>创建有多个执行语句的触发器 举例二、 然后开始创建一个触发器 看看before和after的区别 3》查看触发器: 1> 查看所有触发器,提前要进入某库 4》删除触发器: 语法:
演習: 他の種類のインデックスがあるかどうかを確認してください。
ハッシュ インデックス 主キー インデックス B ツリー インデックス
インデックスの使用をより効率的にするために、インデックスを作成するときに、それらのフィールドにインデックスを作成することと、作成するインデックスの種類を考慮する必要があります;
1>一意のインデックス設定:
一意のインデックス 値は一意であり、このインデックスを通じて特定のレコードをより迅速に決定できます
例: ID 番号は一意であり、一意のインデックスを作成できます。名前の場合は、同じ名前のシチュエーションが存在するため、クエリ時間の速度が低下します。
2> 並べ替え、グループ化、結合操作が頻繁に必要なフィールドのインデックスを作成します。
並べ替え操作、個別のグループ化、結合などの操作が頻繁に必要なフィールドの場合、これらのフィールドのインデックスを作成すると、並べ替え操作に多くの時間がかかります。並べ替え操作を効果的に回避できます。
3> クエリ条件としてよく使用されるフィールドのインデックスを作成します。
フィールドがクエリ条件によく使用される場合、このフィールドのクエリ速度が影響します。テーブル全体のクエリ速度を向上させます。
4>インデックスの数を制限します。
各インデックスにはディスク容量が必要なため、インデックスの数が必ずしも良いとは限りません。インデックスが増えると、より多くのディスク容量が必要になります。インデックスの更新が増えると、インデックスの更新に時間がかかります。
5>データの数:
インデックス値が非常に長い場合、クエリ速度に影響します。たとえば、Char(100) 型フィールドの全文インデックス作成は、char(10) 型フィールドよりも確実に時間がかかります。 ; 使用されなくなったインデックス、またはめったに使用されないインデックスを削除します:
テーブル内のデータが頻繁に更新されたり、データの使用方法が変更されたりした後は、元のインデックスの一部が不要になる可能性があります。DBA は定期的に見つける必要があります。これらのインデックスを削除して、更新操作に対するインデックスの影響を軽減します。
[一意| FullText | Spatial]インデックス|keyインデックス
indexとキーは、インデックスの2つのいずれかを選択するフィールドを指定するために使用されます。
Alias オプションのパラメーター。作成されたインデックスに新しい名前を付けます。
length オプションのパラメーターはインデックスの長さを指定します。長さを指定するには文字型である必要があります。
ASC昇順、DESC降順。 ; 1 & gt; ID を通常のインデックスとして設定するための通常のインデックス Mysql->create table aatest(
id int,
name varchar(20),
sexboolean,
index(id));
create table aatest2(
id int unique,
name varchar(20),
unique index aatest_id(id ASC));
インデックスに登録されます
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 中国語 Web サイトの他の関連記事を参照してください。