Appearance
索引的使用
什么是索引
索引就相当于字典中的目录,有了目录我们就能通过目录快速的找到想要的结果
但是如果没有目录,没有索引那么如果想查找某条数据就必须从前往后一条条的查找
所以索引就是用于帮助我们提升数据的查询速度的
索引的优缺点和使用原则
优点:
- 大大加快数据的查询速度
- 没有任何限制,所有MySQL字段都可以用作索引
缺点:
索引是真实存在的会占用内存空间、会增加数据库体积
如果对作为索引的字段进行增删改操作,系统需要花费时间去更新维护索引
原则
对于常用于查询的字段应该创建索引(作为where条件字段、作为group by分组字段、作为order by 排序字段)
对于主键和外键系统会自动创建索引,无需我们手动创建
对于数据量小的表不需要刻意使用索引
索引的分类:
单值索引:将某个字段的值作为索引
复合索引:将多个字段的值作为索引
唯一索引(唯一键):索引列中的值必须是唯一的,但是允许为空值
主键索引:是一种特殊的唯一索引,不允许有空值
索引操作
查看当前查询是否使用索引
- 查询没有索引的表
select * from stu where id = 999999; #0.695s
- 查询有索引的表
select * from stu2 where id = 999999; #0.008s
- 查看当前的查询语句是否用到索引
explain sql语句;
- 如果返回的结果集中的key有值,那么就表示当前的查询语句中用到了索引
- 如果返回的结果集中的key没有值,那么就表示当前的查询语句中没有用到索引
添加索引
给表设置主键,只要设置了主键,那么系统就会自动创建对应的索引
给表设置外键,只要设置了外键,那么系统就会自动创建对应的索引
给表设置唯一键,只要设置了某一个字段的取值是唯一的,也会自动创建对应的索引
创建表的时候指定给哪个字段添加索引:
sql
create table test1(
id int,
name varchar(255) unique, # 唯一索引
index 索引名称(字段名称) # 手动指定索引
);
- 创建好表之后再给指定字段添加索引
sql
create index 索引名称 on 表名称(字段名); # 创建索引
alter table 表名称 add index 索引名称(字段名称); # 创建索引
- 删除索引
sql
drop index 索引名称 on 表名称;
索引算法
BTREE算法:
索引算法决定了如何创建索引
索引算法决定了如何查找索引对应的数据
btree查找:
4
|---------------|
2 6
|---------| |---------|
1 3 5 7
查找方式:BTree索引是基于平衡多叉树排序实现的,能够缩短查询次数
将小的数据放到枝干的左侧,大的数据放到枝干的右侧,一层层的向下对比查找数据
Hahs索引:
哈希索引是基于哈希表实现的,只能用于memory存储引擎,可以一次性定位到指定数据