MySQL:索引的使用

目录

一、前言

二、索引的本质

三、索引的操作

1.创建主键索引

2.创建唯一键索引

3.创建普通索引

4.创建全文索引

5.查询索引

6.删除索引

7.索引创建原则

8.复合索引

一、前言

为何使用索引?我用下面的一个例子来说明:在数据少的时候,或许没有办法直观地看出索引所体现的好处,但当数据很多时就可以清晰地看出,下面创建一个含800万条数据的EMP表

由上图可以看出当数据很多时,查一条数据的时间是6秒,很显然,这样的速度太慢了当为这个表创建了一个索引后,在用同样的语句进行查询,速度变成了0.01秒,大幅度提升了查询的速度。

二、索引的本质

索引就是在mysqld中建立一个B+树。一个表结构通过给它创建B+树的形式给它创建索引,B+树在mysqld的内存结构中帮我们维护,一个表可以由多个B+树,这取决于我们在这个表中创建了多少个索引。

三、索引的操作

1.创建主键索引

第一种方式:

 -- 在创建表的时候,直接在字段名后指定 primary key

create table user1(id int primary key, name varchar(30));

第二种方式:

-- 在创建表的最后,指定某列或某几列为主键索引

create table user2(id int, name varchar(30), primary key(id));

第三种方式:

create table user3(id int, name varchar(30));
-- 创建表以后再添加主键
alter table user3 add primary key(id);

主键索引的特点
a.一个表中,最多有一个主键索引
b.主键索引的效率高(主键不可重复)
c.创建主键索引的列,它的值不能为null,且不能重复
d.主键索引的列基本上是int

                                       “ 其实就是和主键约束一样”

实例:

create table index_db( id int, name varchar(10) );
alter table index_db add primary key(id);
--添加主键索引

这里BTREE不是指的B树,而是B+树

Key_name:主键的索引名字为PRIMARY

2.创建唯一键索引

第一种方式:

-- 在表定义时,在某列后直接指定unique唯一属性。
create table user4(id int primary key, name varchar(30) unique);

第二种方式:

-- 创建表时,在表的后面指定某列或某几列为unique
create table user5(id int primary key, name varchar(30), unique(name));

第三种方式:

--创建表后再添加唯一键索引
create table user6(id int primary key, name varchar(30));
alter table user6 add unique(name);

唯一索引的特点
a.一个表中,可以有多个唯一索引
b.查询效率高
c.如果在某一列建立唯一索引,必须保证这列不能有重复数据
d.如果一个唯一索引上指定not null,等价于主键索引

实例:

alter table index_db add unique(name);
--添加唯一键索引

唯一键索引和普通索引的默认索引名字都是自己那一列的名字

3.创建普通索引

第一种方式:

create table user8(id int primary key,
name varchar(20),
email varchar(30),
index(name) --在表的定义最后,指定某列为索引
);

第二种方式:

create table user9(id int primary key, name varchar(20), email
varchar(30));
alter table user9 add index(name); --创建完表以后指定某列为普通索引

第三种方式:

create table user10(id int primary key, name varchar(20), email
varchar(30));
-- 创建一个索引名为 idx_name 的索引
create index idx_name on user10(name);

唯一索引也属于普通索引

4.创建全文索引

当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,但是有要求,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。

全文索引只能在char,varchar,text类型的字段上创建。

--这里创建一个新的表格
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)  --全文索引
)engine=MyISAM;
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');
--插入一些数据

想要查询body中含database的信息 

select * from articles where body like '%database%';
--不用全文索引时

 想要知道sql语句是否用到全文索引可以用explain查询以下

explain select * from articles where body like '%database%';

SIMPLE代表这个查询语句没有用到像子查询、联合查询等这些复杂的查询语句

key为NULL说明这个没有用到全文索引

select * from articles 
where match(title,body) against('database');
--这个用到了全文索引

explain select * from articles where match(title,body) against('database')\G

这个显然可以看出用到了全文索引

5.查询索引

第一种方式:

  show keys from 表名

第二种方式:(比较推荐)

show index from 表名;

第三种方式:

desc 表名;
--这种方式信息会比较简略

6.删除索引

第一种方法-删除主键索引:

alter table 表名 drop primary key;

实例: 

alter table index_db drop primary key;

第二种方法-其他索引的删除:

alter table 表名 drop index 索引名;
--索引名就是Key_name后面的名字

第三种方法方法:

drop index 索引名 on 表名

7.索引创建原则

a.比较频繁作为查询条件的字段应该创建索引
b.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件(例如:性别,因为一般只有男或女,所以唯一性很差,不适合作为索引)
c.更新非常频繁的字段不适合作创建索引
d.不会出现在where子句中的字段不该创建索引

8.复合索引

这里直接通过一个例子讲解,还用上面的表

alter table index_db add email varchar(10) not null after name;
--在表中添加一个属性
alter table index_db add index(name,email);
--向表中添加一个复合索引,这个复合索引的名字默认为第一列name

通过上面的图可以看出下面两个索引的索引名字是一样的,这也代表着他们是属于一个索引,属于一个B+树。

复合索引的作用是可以从左到右帮助缩小查找的范围。例如,我们要在微信中查一个人的信息,输入的信息越多,排查的范围越小,越接近我们要查询的结果。

当我们要删除复合索引时,只需删除索引名字就可将两个索引都删掉。

alter table index_db drop index name;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值