索引(一)

234 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

1、什么是索引 index

定义:帮助MySQL提高查询效率的数据结构;

优点:

​ 1、大大加快数据查询速度;

缺点:

​ 1、维护索引需要耗费数据库资源;

​ 2、索引需要占用磁盘空间;

​ 3、当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响;

​ (所以索引一般建立在不经常更新的字段、常用的搜索字段)

2、索引分类

1、主键索引

设定为主键后数据库会自动建立索引,Innodb为聚簇索引;

2、单值索引

即一个索引只包含单个列,一个表可以有多个单列索引;

3、唯一索引

索引列的值必须唯一,但允许有空值(可有多个 null)

4、复合索引

即一个索引包含多个列

5、Full Text 全文索引(MySQL版本之前,只能由于 MYISAM引擎)

全文索引类型为 FULL TEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。

全文索引可以再CHAR、VARCHAR、TEXT类型列上创建。

MYSQL只有MYISAM存储引擎支持全文索引。

3、索引的基本操作

-- 查看索引

show index from t_user;

-- 删除索引

drop index 索引名 on 表名

1.主键索引

创建表时加上主键,自动创建主键索引。

2.普通索引

建表时创建:

create table t_user(id varchar(20) primary key,name varchar(20),key(name)

建表后创建:

create index name_index on t_user(name);

3.唯一索引

建表时创建

create table t_user(id varchar(20) primary key,name varchar(20),unique(name))

建表后创建

create unique index on t_user

4.复合索引

建表时创建

CREATE TABLE tb_test2(
  id INT,
  `name` VARCHAR(200),
  age INT,
  KEY(`name`,age)
)

建表后创建

create index name_age_index on t_user(name,age)

复合索引的使用(面试题)

name age bir

1.最左前缀原则;

2.mysql 引擎在查询为了更好利用索引,在查询过程中会动态调整查询顺序以便利用索引

以下查询字段能否使用到符合索引:

name bir age	可以
name age bir	可以
age bir			不可以
bir age name	可以
age bir			不可以

4、聚簇索引和非聚簇索引

InnoDB的数据直接存储在叶子节点;

MyISAM叶子节点存的是数据的磁盘地址;

聚簇索引

将数据存储与索引放到了一块,找到索引也就找到了数据

非聚簇索引

将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。

澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

何时使用聚簇索引与非聚簇索引

非聚簇索引一定会回表查询吗? 不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。

举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。