MySQL索引

索引的基本类型
btree 和 hash ,btree是默认索引

Btree 必须从根节点开始采用二分法查找
hash 算法是基于等值计算的

普通索引
普通索引 index 显示标志MUL
作用: 以索引为查寻条件加快查寻速度
通常表中作为查寻条件的字段设置为索引字段,字段值可以重复,一个表中可以有多个index字段,字段的值可以为空

1,把已有表中的字段设置为index字段
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | | NULL | |

创建索引
mysql> create index index_name on top1(name);
在top1表中的name字段建立名为index_name的index索引,index后是索引名,top1(name)是top1表中的name字段

创建索引后检查
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | MUL | NULL | |
这里我们看到在name字段的Key 显示MUL 表示已经创建成功普通索引 但是在这里我们看不到索引名 以后如果需要索引名就用下面命令

查看表中的索引要比desc详细(desc查看索引类型 show 查看索引名及其他)
mysql> show index from top1\G
*************************** 1. row ***************************
Table: top1
Non_unique: 1
Key_name: name_index
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 7
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:

前缀索引 指定已有字段中前N个字符做为索引
mysql> create index name_index on top1(name(3));
注:在top1表的name列的前3个字符创建名为name_index的普通索引

mysql> show index from top1\G
*************************** 1. row ***************************
Table: top1
Non_unique: 1
Key_name: name_index
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 7
Sub_part: 3
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:

为多个字段创建联合索引
mysql> create index id_name_index on top1(id,name);
为id和name字段创建联合索引
mysql> show index from top1\G
*************************** 1. row ***************************
Table: top1
Non_unique: 1
Key_name: id_name_index
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 7
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: top1
Non_unique: 1
Key_name: id_name_index
Seq_in_index: 2
Column_name: name
Collation: A
Cardinality: 7
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:

提示:联合索引前缀生效条件
例 index(a,b,c) 仅a ab abc 三个查寻条件可以走索引

2,建表时,创建index字段
mysql> create table top7(
-> name char(20),
-> age int(2),
-> sex enum(“boy”,“girl”),
-> index(name),
-> index(sex)
-> );

mysql> desc top7;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| name | char(20) | YES | MUL | NULL | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | MUL | NULL | |

注:这里我们创建的是两个普通索引而不是联合索引

删除索引
mysql> drop index id_name_index on top1;
注:index后面加的是索引名而不是字段名
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | | NULL | |

唯一索引
约束插入条件唯一性,例如邮箱
唯一索引 unique 显示标志 UNI
字段的值不允许重复,但字段值可以为空,一个表中可以有多个unique字段,当把字段不允许为空时约束方式和主键一样。
1,把已有字段设置为unique字段
mysql> create unique index mail_index on top1(mail);
在top1表的mail字段设置唯一索引 ,索引名为 mail_index

添加之后检查
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| mail | varchar(20) | YES | UNI | NULL | |
这里看到mail字段的Key已经变成UNI,表示添加成功

2,建表时创建
mysql> create table top8(
tel char(11),
mail varchar(50) not null,
name char(20),
unique(tel),
unique(mail)
);
注:如果唯一索引没有约束条件 not null的情况就显示为UNI 如果加上not null约束条件就会显示为PRI(主键索引)

mysql> desc top8;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| tel | char(11) | YES | UNI | NULL | |
| mail | varchar(50) | NO | PRI | NULL | |
| name | char(20) | YES | | NULL | |

3,删除索引
mysql> drop index mail_index on top1;

主键索引
字段值不允许重复且字段值不允许为空,一个表中只能有一个主键字段。通常和auto_increment(让字段的值自动增长,自加1)约束条件一起使用 显示标志 PRI

1,把已有字段设置为primary key (建表后通过alter增加主键索引)一般不这样做
mysql> alter table top1 add primary key(id);
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | NO | PRI | 0 | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| mail | varchar(20) | YES | | NULL | |
添加后查看id的Key字段变成了PRI 表示已经设置成功

2,建表时创建primary key字段
mysql> create table top9(
-> id int(3) auto_increment,
-> stu_id char(4),
-> name carchar(20),
-> primary key(id)
-> );
建表后检查
mysql> desc top9;
±------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±---------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| age | int(3) | YES | | NULL | |

3,删除主键索引 primary key
mysql> alter table top1 drop primary key;
mysql> desc top1;
±------±-------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------------±-----±----±--------±------+
| id | int(3) | NO | | 0 | |
| age | int(2) | YES | | NULL | |
| sex | enum(‘boy’,‘girl’) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| mail | varchar(20) | YES | | NULL | |

注:删除有auto_increment的primary key必须先去掉auto_increment
mysql> mysql> alter table top9 drop primary key;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
不删除auto_increment 会报错的哦
正确做法
mysql> alter table top9 modify id int(3) not null;
mysql> alter table top9 drop primary key;
mysql> desc top9;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(3) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(3) | YES | | NULL | |

复合主键
中的多个字段同时做主键字段,必须建表时创建 复合主键字段的值只要不同时重复就可以
mysql> create table top8(
-> clientip varchar(15),
-> sername varchar(20),
-> port char(5),
-> primary key(clientip,port)
-> );
创建后查看
mysql> desc top8;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| clientip | varchar(15) | NO | PRI | | |
| sername | varchar(20) | YES | | NULL | |
| port | char(5) | NO | PRI | | |

外键索引
foreign key
让当前表中外键字段的值,只能在指定的另一个表中的某个字段值得范围内选择
使用规则
1,表的存储引擎必须是innodb
2,字段的类型要匹配
3,被参考字段不许是键值(key)中的一种,通常设置为主键

1,把已有字段设置为 foreign key
mysql> alter table top7 add foreign key(gz_id) references top6(yj_id) on update cascade on delete cascade;
查看外键名
mysql> show create table top7\G
*************************** 1. row ***************************
Table: top7
Create Table: CREATE TABLE top7 (
gz_id int(2) NOT NULL,
gz float(7,2) DEFAULT NULL,
KEY gz_id (gz_id),
CONSTRAINT top7_ibfk_1 FOREIGN KEY (gz_id) REFERENCES top6 (yj_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2 建表时创建外键 foreign key
mysql> create table top6(
-> yj_id int(2) primary key auto_increment,
-> name varchar(20)
-> );

mysql> create table top7(
-> gz_id int(2) not null,
-> gz float(7,2),
-> foreign key(gz_id) references top6(yj_id) on update cascade on delete cascade
-> );
top7表中gz_id字段参考top6表中yj_id字段 同步更新 同步删除,也就是top6表中添加删数据top7中也会做相应更改

在外键表中查看
mysql> show create table top7\G
*************************** 1. row ***************************
Table: top7
Create Table: CREATE TABLE top7 (
gz_id int(2) NOT NULL,
gz float(7,2) DEFAULT NULL,
KEY gz_id (gz_id),
CONSTRAINT top7_ibfk_1 FOREIGN KEY (gz_id) REFERENCES top6 (yj_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

注:CONSTRAINT top7_ibfk_1 这个就是键的名字

3 删除外键索引
mysql> alter table top7 drop foreign key top7_ibfk_1;

全文索引
fulltext
分词,全文索引以词为基础的

1 把已有字段设为 fulltext
mysql> create fulltext index full_index on top1(mail);
添加后查看
mysql> show index from top1\G
*************************** 1. row ***************************
Table: top1
Non_unique: 1
Key_name: full_index
Seq_in_index: 1
Column_name: mail
Collation: NULL
Cardinality: 8
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: FULLTEXT
Comment:
Index_comment:

2 建表时创建全文索引 fulltext
mysql> create table top9(
-> id int(3),
-> name char(10),
-> mail varchar(30),
-> fulltext(name)
-> );

创建后查看
mysql> show index from top9\G
*************************** 1. row ***************************
Table: top9
Non_unique: 1
Key_name: name
Seq_in_index: 1
Column_name: name
Collation: NULL
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: FULLTEXT
Comment:
Index_comment:

删除全文索引
mysql> drop index name on top9;

Mysql索引既然可以加快查寻速度,那么就给所有的列建索引?
答:因为索引不但占用系统磁盘空间,更新数据库时还需要维护索引数据,因此,索引是一把双刃剑,并不是越多越好,写频繁,读少的业务要少建立索引。

需要在哪些列上创建索引?
答:select user,host from mysql.user where host=….索引一定要创建在where后的条件列,而不是select后的选择数据列,另外我们要尽量选择在唯一值多的大表上建立索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值