索引的出现就是为了提高查询的效率,就像书的目录一样
查询主要有2种方式:
- 全表扫描
- 根据索引检索
查看是否使用了索引:在SQL语句前添加explain
关键字
type=ALL
,表示使用全表查询tyep=RES
,表示使用索引
创建索引
create index 索引名 on 表名(列名);
删除索引
drop index 索引名 on 表名;
- 主键会自动添加索引对象
- 一个字段如果有
unique
约束,也会自动创建索引对象
索引的类型
- 普通索引:最基本的索引,没有任何限制
- 唯一索引:与普通索引类似,但索引列的值必须是唯一的,允许空值
- 主键索引:一种特殊的唯一索引,一个表只能有一个主键,不允许有空值
- 组合索引:在多个字段上创建的索引,只有在查询条件中使用了创建索引的第一个字段,索引才会被使用
- 全文索引:主要用来查找⽂本中的关键字,类似于搜索引擎
InnoDB的索引模型
InnoDB使用了B+
树索引模型
create table T (
id int primary key, -- 主键,自动创建索引
k int not null,
name varchar(16),
index (k) -- 给字段k添加索引
)
engine=InnoDB;
主键索引与非主键索引的区别
根据叶子节点的内容,索引分为主键索引(聚簇索引,clustered index
)和非主键索引(二级索引,secondary index
)
通过聚簇索引可以查到需要的数据,而通过非聚簇索引可以查到记录对应的主键值 ,再使用主键的值通过聚簇索引查找到需要的数据。聚簇索引和非聚簇索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
索引失效的情况
- 对索引使用左或者左右模糊匹配,如
like %x
或者like %x%
- 对索引使用函数
- 对索引进行表达式计算
- 对索引隐式类型转换
- 联合索引非最左匹配
OR
有一边的条件字段没有索引