什么是索引
MySQL官方对于索引的定义:索引是帮助MySQL高效过去数据的数据结构。
MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。
简单理解为“排好序的可以快速查找数据的数据结构”
索引数据结构
下图就是一种可能是二叉树(btree)的索引方式
二叉树数据结构的弊端:当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。例如:
where id = 13
查找数据?
正常查找数据从上往下查找数据,假如查找“13 小明”这条数据,正常需要6次
遍历。如果我们提前建立好了二叉树,我们查找“13 小明”这条数据只需要3次
遍历
MySQL中常用的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(Memory存储引擎)等等
索引的优势和劣势
优势:提高数据检索的效率,降低数据库的IO成本。通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
劣势:索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的键值变化后的索引的信息。
索引使用场景
哪些情况需要创建索引:
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引(where 后面的语句)
- 查询中与其他表关联的字段,外键关系建立索引
- 多字段查询下倾向创建组合索引
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组字段
哪些情况不推荐建立索引
- 表记录太少
- 经常增删改的表
- where 条件里用不到的字段不建立索引
索引分类(MySQL的索引类型)
索引类型 | 功能说明 |
---|---|
普通索引 | 最基本的索引,它没有任何限制 |
唯一索引 | 某一行企用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的 |
主键索引 | 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码 |
全文索引 | 对于需要全局搜索的数据,进行全文索引 |
1.普通索引
创建普通索引:alter table 表名 add index(字段)
或者 alter table 表名 add index 索引名称(字段)
删除普通索引:drop index 索引名称 on 表名
# 为money表的username字段增加索引
ALTER TABLE money ADD INDEX( username);
# 从money表中删除username索引
drop index username on money;
# 普通索引中有种特殊情况,复合索引(使用多字段创建索引)
alter table user add index xm(xing, ming);
# 删除复合索引
drop index xm on user;
2.唯一索引
创建唯一索引:alter table 表名 add UNIQUE(字段)
或者 create unique index 索引名 on 表名(字段)
删除唯一索引:drop index 索引名 on 表名
# 为money表的email字段增加唯一索引
ALTER TABLE money ADD UNIQUE(email);
# 或者为索引另取一个名字
alter table money add unique email_idx(email)
# 从money表删除唯一索引email字段
drop index email on money;
3.全文索引
创建全文索引:alter table 表 add FULLTEXT(字段);
删除全文索引:drop index 索引名称 on 表名;
# 为money表的content字段增加全文索引
ALTER TABLE money ADD FULLTEXT(content );
# 删除全文索引
drop index content on money;
4.主键索引
创建主键索引:alter table 表名 add PRIMARY KEY(字段);
删除主键索引:alter table 表名 drop primary key
示例:
# 为money表的id字段增加主键索引
ALTER TABLE money ADD PRIMARY KEY(id );
# 从money表中删除主键索引
alter table money drop primary key;
5.创建表时也可以声明索引
# 创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX [索引名] (字段)
FULLTEXT [索引名] (字段)
UNIQUE[索引名] (字段)
# 注:中括号中的索引名,代表可选
整体示例如下:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content INT NOT NULL ,
PRIMARY KEY ( id ),
INDEX pw ( password),
UNIQUE ( username ),
FULLTEXT ( content )
) ENGINE = InnoDB;
其他案列
#随表建立索引
create table customer(
id int(10) auto_increment,
customer_no varchar(20),
customer_name varchar(20),
primary key(id) ,
unique idx_customer_no(customer_no),
key idx_customer_name(customer_name),
key idex_customer_no_name(customer_no,customer_name)
);
drop table if exists customer;
create table customer(
id int(10) ,
customer_no varchar(20),
customer_name varchar(20)
);
#创建主键索引
alter table customer add primary key(id);
#删除主键索引
alter table customer drop primary key;
#创建唯一索引
alter table customer add unique idx_customer_no(customer_no);
#删除唯一索引
drop index idx_customer_no on customer;
#创建单值索引
alter table customer add index idx_customer_name(customer_name);
#删除单值索引
drop index idx_customer_name on customer;
#创建复合索引
alter table customer add index idx_customer_no_name(customer_no,customer_name);
#删除复合索引
drop index idx_customer_no_name on customer;