数据库——MySQL索引

@toc

学习准备:先创建一个表

mysql -u root -p
create database school;
use school;
create table class(
id int(10) not null,
name varchar(20) not null,
sex char(2) not null,
cardid varchar(20) not null,
phone varchar(11),
address varchar(50));
desc class;
insert into class values ('1','zhangsan','男','123456','111111','苏州');
insert into class values ('2','lisi','女','123123','222222','苏州');
insert into class values ('3','wangchao','男','123412','333333','扬州');
insert into class values ('4','zhanglong','男','112233','444444','南京');
insert into class values ('5','zhaohu','男','111222','555555','苏州');
select * from class;


                                            数据库——MySQL索引

一、MySQL索引

(一)索引的概念

  • 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)。
  • ==使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据数据透视表库的查询速度。==
  • 索引就好比是一本书的目录,可以根据目录中字段限定符用来限定检索标识的的页码快速找到所需的内容。
  • 索引是表中一列或者若干mysql索引列值排序的方法。
  • 建立索引的目的是加快对表中记录的查找或排序。

(二)索引的作用

  • 设置了合适的索引之后,数据库利用各种快数据结构速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因数据
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的IO成本,并且索引还可以降低数mysql索引据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数字段名词解释据时能显著提高性能

字段英文引的副作用:

  • 索引需要占用额外的磁盘空间。
    对于 MyISmysql增删改查语句AM 引擎而言,索引文件和数据文件是数据库设计分离的,索引文件用于保存数据记录的地址。
    而 InnoDB 引擎的表数据文件本身就是索引文件。
  • 数据库系统的核心是插入表名怎么设置和修改数据时要花费更多的时间,因为索引也要随之变动。

(三)创建索引字段计算器的原则依据

索引随可以提升数据库查询的速度,但并不是任何情况下都字段计算器适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会数据透视表先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位。
  • ==记录数超过300行的表应该有索引==。如果没有索引,需要把表遍历一遍,会严重mysql创建表影响数据库数据恢复的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引。
  • 唯一性太差的字段不适合建立索引。
  • 更新太频繁地字段不适合创建索引。
  • ==经常出现在 where,GROUP BY、ORDER BY或者多表查询时连接mysql安装的字段上创建索引,特别是大表的字段,应该建立索引。==
  • 索引应该建在选择性高的字段上。
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

(四)索引的分类和创建

1、表名 普通索引

  • 最基本的索引类型,没有唯一性之类的限制。

    (1)直接创建索引

    
    CREATE INDEX 索引名 ON 表名 (列名[(length)]);
    #(列名(length)):length是可选项,下同。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
    #索引名建议以“_index”结尾。

例:
create index phone_index on class (phone);
show keys from class\G;

![image.png](https://s2.51cto.com/images/20220212/1644640865847772.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (2)修改表方式创建

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

例:
alte字段数据类型r table class add in字段dex id_index (id);
show keys from class\G;

![image.png](https://s2.51cto.com/images/20220212/1644640927765502.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (3)创建表的时候指定索引

CREATE TABLE 表名 ( 字数据库技术段1 数数据库系统概论第五版课后答案据类型,字段2 数据类型[,...],INDEX 索mysql数据库引名 (列名));

例:
create table test(
id int(10) no数据分析t null,
name varchar(20) not null,
index id_index (id));mysql增删改查语句

show keys from test\G;

![image.png](https://s2.51cto.com/images/20220212/1644641021851569.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
## 2、唯一索引
- 与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。
### (1)直接创建唯一索引

CREATE UNIQUE数据漫游 INDE数据库原理及应用X 索引名 ON 表名(列名);

例:
create unique index ad表名在上方还是下方dress_index on cla数据库ss(address);
create unique index id_ind字段是什么意思ex on class(id);

show keys from class\G;

==这里先删除了class表里的索引,方便做实验==
![image.png](https://s2.51cto.com/images/20220212/1644641136805494.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220212/1644641395155919.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (2)修改表方式创建

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

例:
alter table class add unique cardid_index (cardid);
show keys from class\G;

![image.png](https://s2.51cto.com/images/20220212/1644641536668625.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (3)创建表的时候指定

C字段名词解释REATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

例:
create table test2(
id in数据库管理系统t(10) not null,
name varchar(20) not null,
unique id_index (id));

show keys from test2\G;

![image.png](https://s2.51cto.com/images/20220212/1644641677531304.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
## 3、主键索引
- 是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
### (1)创建表的时候指定

CREATE TABLE 表名 ([...],PRIMA字段计算器RY KEY (列字段限定符用来限定检索标识的名))字段宽度;

例:
create table test3(
id int(10) not null,
na数据库查询语句me varchar(20) not null,
primary key (id));

create table tes数据恢复t4(id int(10) not null primar数据y key,name varchar(20) not null);

show ke字段限定符用来限定检索标识的ys from test3\G;数据分析师
show kmysql安装eys from test4\G;

![image.png](https://s2.51cto.com/images/20220212/1644642399236152.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220212/1644642420832901.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (2)修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名);

例:
alter table class add primary k字段宽度ey(id);
show keys from class\G;

![image.png](https://s2.51cto.com/images/20220212/1644643233606672.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 4、组合索引(单列索引与多列索引)
- 可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

例:
create table test5(数据漫游是什么意思id int(10) not null,
name varchar(20) not null,
sex char(2) not null,
index index_amd (id,name));

show keys from test5\G;
insert into test5 values(1,'zhangsan','男');
select * f字段数据类型rom test5 where id=1 and name='zhangsan';

![image.png](https://s2.51cto.com/images/20220212/1644643751601732.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220212/1644644016480378.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 5、全文索引(FULLTEXT)
- 适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
- 在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎;
- 在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。
- 全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。
### (1)直接创建索引

CREATE FULLTEXT IN字段名DEX 索引名 ON 表名 (列名);

例:
create fulltext index address_index on class (ad数据结构dress)数据漫游;

![image.png](https://s2.51cto.com/images/20220212/1644644278628901.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (2)修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

例:
alter table class add fulltext addr数据漫游ess_index (address);

![image.png](https://s2.51cto.com/images/20220212/1644644309826971.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (3)创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (数据分析师列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

例:
create table test6(
id int(10) not null,
name varchar(20) not null,
address varchar(50),
fulltext addres数据分析s_full(address));

insert into test6 values ('1','zhangsan','suzho数据恢复u');
insert into test6 values ('2','lisi','suzhou');
insert into test6 valu字段名词解释es ('3','wangwu','n字段计算器an数据库jing');

![image.png](https://s2.51cto.com/images/20220212/1644644504837640.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220212/1644644515696068.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (4)使用全文索引查询

SELECmysql怎么读T * FROM 表名 WHERE MATCH(列名) AGAINST(字段限定符用来限定检索标识的'查询内容');

例:
select * from test6 where match(address) against('suzhou');

![image.png](https://s2.51cto.com/images/20220212/1644644632995629.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (五)查看索引

#两个命令查看的信息一样,选其一即可。
s数据库原理及应用how index from 表名;
或者
show keys from 表名数据库系统工程师;
#---------------查看各个字段的解释-------数据库系统的核心是---------------------------字段限定符用来限定检索标识的------------------
各字段的含义如下:
Table:表的名称。
Non_unique:如果索引不能包括重复词,则为 0;数据库原理及应用如果可以,则为 1字段限定符用来限定检索标识的
Key_name:索引的名称。
Seq_in_index:索引中的列序号,从 1 开始数据库系统概论第五版课后答案
Column_nam字段数据类型e:列mysql面试题名称。
C数据库ollation:列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality:索引中唯一值数目的估计值。
Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如数据库果整列被编入索引,则为 NULL。
Packed:指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null:如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment:备注。

![image.png](https://s2.51cto.com/images/20220212/1644648722839002.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/20220212/1644648769120899.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### (六)删除索引
### 1、直接删除索引

DROP INDEX 索引名 ON 表名;
例:
drop index address_index on class;

![image.png](https://s2.51cto.com/images/20220212/1644648825975341.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 2、修改表方式删除索引

ALTER TABLE 表名 D字段数据类型ROP INDEX 索引名;
例:
alter table class dro字段是什么意思p index id_index;数据库管理系统

![image.png](https://s2.51cto.com/images/20220212/1644648930569524.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 3、删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;
例:
alter table字段类型char是什么意思 class drop primary key;


![image.png](https://s2.51cto.com/images/20220212/1644649224861233.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)