Mysql索引

文章详细介绍了数据库索引的概念、作用、创建原则和不同类型,包括普通索引、唯一索引、主键索引、组合索引和全文索引。索引可以显著提高查询速度,但也占用磁盘空间并影响数据插入和修改的速度。创建索引应考虑数据量、字段选择性和更新频率等因素。
摘要由CSDN通过智能技术生成


一、索引的概述

索引通常指的是数据库中的索引,它是一种数据结构,用于提高数据库查询的效率。索引能够加快数据的检索速度,类似于书中的目录或者字典中的索引。

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。

使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。

索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。

索引是表中一列或者若干列值排序的方法。

建立索引的目的是加快对表中记录的查找或排序。

二、索引的作用

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。

当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。

可以降低数据库的I0成本,并且索引还可以降低数据库的排序成本。

通过创建唯一性索引, 可以保证数据表中每一行数据的唯一性。

可以加快表与表之间的连接。

在使用分组和排序时,可大大减少分组和排序的时间。

建立索引在搜索和恢复数据库中的数据时能显著提高性能

2.1 索引的优点

1、提高查询效率:创建索引可以大大加快查询语句的执行速度。使用索引可以直接定位到满足查询条件的数据行,而不需要逐行扫描整个表。这可以减少查询的时间复杂度,提高查询效率。

2、减少磁盘IO:索引可以减少磁盘IO次数,因为数据库可以直接访问索引所在的位置,而不是扫描整个表。这可以减少数据的读取时间,提高查询性能。

3、支持唯一性约束:通过在列上创建唯一索引,可以确保列中的值唯一,避免重复数据的插入或更新。这可以提高数据的完整性和一致性。

4、支持主键和外键约束:索引对于主键和外键约束的支持非常重要。主键索引可以快速定位和访问表中的唯一记录,而外键索引可以加速关联查询的执行。

5、支持排序和分组操作:索引可以帮助数据库快速定位并按照指定的顺序访问数据。这对于涉及排序和分组的查询非常有用,可以提高操作的效率。

6、提高并发性能:通过使用索引,可以减少数据的读取和写入时间,从而提高数据库的并发性能。多个用户可以同时执行查询操作,而不会造成过多的阻塞和等待。

2.2 索引的缺点

索引需要占用额外的磁盘空间。

对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。 而 InnoDB 引擎的表数据文件本身就是索引文件。

在插入和修改数据时要花费更多的时间,因为索引也要随之变动。

三、创建索引的原则依据

1、表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位。

2、记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。

3、经常与其他表进行连接的表,在连接字段上应该建立索引。

4、唯一性太差的字段不适合建立索引。

5、更新太频繁的字段不适合创建索引。

6、经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。

7、在经常进行 GROUP BY、ORDER BY的字段上建立索引;

8、索引应该建在选择性高的字段上。

9、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

MySQL的优化哪些字段/场景适合创建索引,哪些不适合?

1、表的主键、外键必须有索引

2、数据量超过300行的表应该有索引【数据量特别大的】

3.经常与其他表进行表连接的表,在连接字段上应该建立索引

4.唯一性强的字段应该建立索引。太差的不适合建立,如果索引字段的数据唯一性太差,定位数据表中的数据时,并不能提升查询速度,反而会更加慢。

5.更新太频繁的字段不适合创建索引。在表中进行增删改查时,索引也会有相应的操作产生。字段更新频繁,对系统资源占用的太多。

6.经常出现在where条件子句中的字段,特别是大表的字段,应该建立索引。

7.索引应该建立在选择性高的字段上,如果很少的字段拥有相同值,即有很多独特性,则选择性很高。

8.索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引。

四、索引的分类和创建

1.普通索引

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

直接创建索引

CREATE INDEX 索引名 ON 表名 (列名[(length)]);
 
#(列名(length)):length是可选项。
如果忽略 length 的值,则使用整个列的值作为索引。
如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。
 
例:create index phone_index on member (phone);
select phone from member;
show create table member;
create database info;
use info;
create table ky29 (id int(10),name varchar(10),cardid varchar(18),phone varchar(11),address varchar(50),remark text);
desc ky29;

insert into ky29 values (1,'zhangsan','123','111111','nanjing','this is vip');
insert into ky29 values (4,'lisi','1234','444444','nanjing','this is normal');
insert into ky29 values (2,'wangwu','12345','222222','benjing','this is normal');
insert into ky29 values (5,'zhaoliu','123456','555555','nanjing','this is vip');
insert into ky29 values (3,'qianqi','1234567','333333','shanghai','this is vip');
select * from ky29;

在这里插入图片描述
在这里插入图片描述

1、修改表方式创建

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

例:alter table ky29 add index id_index (id);
select id from ky29;
select id,name from ky29;

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2、创建表的时候并指定索引

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
 
例:create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;

在这里插入图片描述

2.唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

CREATE UNIQUE INDEX 索引名 ON 表名(列名);
 
例:select * from  ky29;
create unique index address_index on  ky19 (address);
create unique index name_index on  ky19 (name);
show create table  ky29;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、修改表方式创建


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

例:alter table ky29 add unique cardid_index (cardid);

在这里插入图片描述
在这里插入图片描述

2、创建表的时候指定

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

例:create table amd2 (id int,name varchar(20),unique id_index (id));
show creat table amd2;

create table test2 (id int,name varchar(40),age int(5),primary key (id));

在这里插入图片描述
在这里插入图片描述

3.主键索引

是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。
一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

创建表的时候指定

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

例:create table test1 (id int primary key,name varchar(20));
create table test2 (id int,name varchar(20),primary key (id));

show create table test1;
show create table test2;

第一种方法:create table test1 (id int primary key,name varchar(20));
在这里插入图片描述
第二种方法:create table test2 (id int,name varchar(20),primary key (id));
在这里插入图片描述

1、修改表方式创建


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

在这里插入图片描述

4.组合索引

可以是单列上创建的索引,也可以是在多列上创建的索引。

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

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

例:create table amd1 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table amd1;
insert into amd1 values(1,'zhangsan','123123');
select * from amd1 where id=1 and name='zhangsan';

在这里插入图片描述
在这里插入图片描述
注:组合索引创建的字段顺序是其触发索引的查询顺序

例如:

--+
| test3 | CREATE TABLE "test3" (
  "id" int(11) NOT NULL,
  "name" varchar(50) DEFAULT NULL,
  "age" int(5) DEFAULT NULL,
  KEY "index_idname" ("id","name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
对以上的表进行select 
select id,name from test3;			#会触发组合索引
而:
select name,id from test3;			#按照索引从左到右检索的顺序,则不会触发组合索引

大量数据才能展示是否触发组合索引,未触发查询速度慢。

5.全文索引(FULLTEXT)

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。

1、直接创建索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

例:select * from ky29;
create fulltext index remark_index on ky20 (remark);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、修改表方式创建

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

在这里插入图片描述
在这里插入图片描述

3、创建表的时候指定索引


CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名)); 
1
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
例:create table test2 (id int,name varchar(10),fulltext name_index (name));

在这里插入图片描述

4、使用全文索引查询


SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

例:select * from ky20 where match(remark) against('this is vip');
or select * from ky20 where remark='this is vip';

在这里插入图片描述在这里插入图片描述

五、查看索引

show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;

在这里插入图片描述
在这里插入图片描述
各字段的含义如下:

Table表的名称
Non_unique如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
Key_name索引的名称。
Seq_in_index索引中的列序号,从 1 开始。 limit 2,3
Column_name列名称。
Collation列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality索引中唯一值数目的估计值。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。如果整列被编入索引,则为 NULL。
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment备注。

六、删除索引

1.直接删除索引

DROP INDEX 索引名 ON 表名;
 
例:drop index name_index on ky29;

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.修改表方式删除

ALTER TABLE 表名 DROP INDEX 索引名;

例:alter table member drop index id_index;
show index from member;

在这里插入图片描述
在这里插入图片描述

3.删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

在这里插入图片描述

案例:比如为某商场做一个会员卡的系统。这个系统有一个会员表,有下列字段:
会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 INT(18)
会员电话 INT(11)
会员住址 VARCHAR (50)
会员备注信息 TEXT

create table ky29 (id int(10),name varchar(10),cardid varchar(10),phone int(11),address varchar(50),remark text);
alter table ky29 add primary key (id);
create index name_index on ky29 (name);
create unique index cardid_index on ky29(cardid);
alter table ky29 add fulltext remark_index (remark);

那么会员编号,作为主键,使用 PRIMARY KEY
会员姓名,如果要建索引的话,那么就是普通的 INDEX
会员身份证号码,如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
会员备注信息,如果需要建索引的话,可以选择 FULLTEXT,全文搜索。
不过 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。


总结

1、索引分类
① 普通索引 :针对所有字段,没有特殊的需求/规则
② 唯一索引 : 针对唯一性的字段,仅允许出现一次空值
③ 组合索引 (多列/多字段组合形式的索引)
④ 全文索引(varchar char text)
⑤ 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

2、索引创建
① 在创建表的时候,直接指定index
② alter修改表结构的时候,进行add 添加index
③ 直接创建索引index
PS:主键索引——》直接创建主键即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值