MySQL索引

1.索引是什么

索引是一个单独的、存储在磁盘上的数据库结构 ,包含着对数据表里所有记录的引用指针。简单来讲,数据库索引就像是书前面的目录,能加快数据库的查询速度。

(1)索引的存储类型

MySQL中索引的存储类型有两种,即 BTree 和 Hash。

hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

(2)MySQL的存储引擎

MySQL 的存储引擎有:InnoDB、MyISAM、Memory、Heap。InnoDB / MyISAM 只支持 BTree 索引,Memory / Heap 都支持 BTree 和 Hash 索引。

什么是存储引擎:https://blog.csdn.net/bbj12345678/article/details/120786449

2.索引的分类

MySQL数据库一共支持5种类型的索引,分别是普通索引、唯一性索引、主键索引、复合索引和全文索引。

(1)普通索引:MySQL中基本索引类型,添加普通索引的列对数据没有特殊要求,允许在定义索引的列中插入重复值和空值。

创建表是添加普通索引,语法如下:

create table test(
id int not null  primary key,
tname varchar(30),
gender char(6),
email varchar(50),
key 索引名称(字段名)
)

或者把key关键字换成index。

例1:创建一个名为test的表,有id,tname,gender和email四个字段,将tname字段设置为普通索引。

create table test(
id int not null  primary key,
tname varchar(30),
gender char(6),
email varchar(50),
key index_tname(tname)
)

查看表结构

 

  创建表之后向表内的字段添加普通索引的sql语法:

alter table 表名 add index 索引名称(字段);

例2:在test表中添加一个名为time的字段,数据类型为timestamp类型,将其设置为普通索引

alter table test add column time TIMESTAMP;
alter table test add index index_time(time);

 删除普通索引语法:

alter table 表名 drop index `索引名称`;

查看指定表的索引的语法:

show index from 表名;

 (2)唯一索引:要求索引列的值必须唯一,但允许有空值,主键索引是一种特殊的唯一索引,不允许空值。

唯一性索引常用语添加在注入身份证号、学号、电子邮箱等字段中,不可以添加在注入名字、性别、年龄等字段中。

创建表的时候添加唯一索引的语法(与普通索引相似),在创建表的时候,最后一行添加:

unique key(字段名称);

例3:在test表中添加一个名为mail的字段,数据类型为varchar(50),将其设置为唯一索引。 

alter table test add column mail varchar(50);
alter table test add  UNIQUE key(mail);

(3)主键索引:一种特殊的唯一索引,不允许有空值。是数据库的所有索引中查询速度最快的,并且每个数据表只能有1个主键索引列。语法与唯一索引相似,将unique key换为primary key。

(4)复合索引:包含不同的字段的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用复合索引时遵循最左前缀集合。

如:将IP和端口号作为标识数据包的依据,这时就可以把IP地址的列和端口号的列创建为复合索引。

注意:复合索引相当于一个多列的主键索引,因此,添加复合索引的任何一个列都不允许数据为空,并且这些列不允许数据完全相同。

(5)全文索引:用于解决大数据量的情况下模糊匹配的问题。如果数据库中某个字段的数据量非常大,那么如果我们想要使用like+通配符的方式进行查找,速度就会变得非常慢。

全文索引的原理便是通过分词技术,分析处文本中关键字及其出现的频率,并依次建立索引。主要限制如下:

1>MySQL5.6以后的版本,MyISAM引擎和InnoDB引擎都支持全文索引。
2>只有字段数据类型为char、varchar、以及text的字段才支持添加全文索引。

语法如下:

create table intro(id int,content text(500))ENGINE=MyISAM;
create fulltext index id_con on intro(content);

创建表以后添加全文索引,删除索引语法:

alter table 表名 add fulltext index(字段名);
alter table 表名 drop index 索引名称;

创建了全文索引后,也不能够使用like+通配符的方式进行模糊查询,全文索引的使用有其特定的语法,如下所示:

select * from test where match(tname) against ('三');

其中,match后面的括号里是含有全文索引的字段,against后面的括号里是要模糊匹配的内容。
此外,全文索引的作用并不是唯一的,在很多场景下,我们并不会使用MySQL数据库内置的全文索引,而是使用第三方类似的索引以实现相同的功能。

 3.索引的测试

向例1的test表中插入100万条数据进行测试

#创建存储过程,实现批量插入记录
delimiter $$ #声明存储过程的结束符号为$$
create procedure insertToTest()
BEGIN
    declare i int default 1;
    while(i<300000)do
        insert into test values(i,concat('york',i),'',concat('york',i,'@qq.com'));
        set i=i+1;
    end while;
END$$ #$$结束
delimiter ; #重新声明分号为结束符号

#调用存储过程
call insertToTest();

测试之前,先查询当前表的索引情况,将所有的索引删除,包括主键(唯一索引)

 

测试一条查询语句

select * from s1 where id=555;

 

 

参考文章:

https://www.jb51.net/article/232312.htm

https://www.cnblogs.com/bypp/p/7755307.html

https://blog.codinglabs.org/articles/theory-of-mysql-index.html

posted @ 2022-12-26 15:13  YorkShare  阅读(69)  评论(0编辑  收藏  举报