1.什么是索引?作用?
索引相当于 一本书的目录,通过目录(索引)可以快速的找到对应的资源。
在数据库中,查询一张表的时候有两种方式:
第一种:全表扫描
第二种:根据索引检索(效率最高)
索引提高检索效率的根本原理是:缩小了扫描的范围。
正确的使用索引可以提高检索效率,但是随意的添加索引是不被允许的,因为索引也是数据库中的对象,也需要数据库的不断维护,如果表中的数据经常被修改那么该数据就不适合添加索引,因为数据一旦修改,索引就需要进行重新排序,进行维护,维护的成本也会提高。
添加索引是给某一个字段,或者说某些字段添加索引
不使用索引:select ename,sal from emp where ename=‘JAMES‘;
使用explain查看select ename,sal from emp where ename=‘JAMES‘;的执行计划。
explain select ename,sal from emp where ename=‘JAMES‘;
当ename字段上没有添加索引的时候,以上sql语句会进行全表扫描,扫描ename字段中所有的值。
使用索引:首先创建索引 create index 名称 on 表名(字段名)
create index emp_ename_index on emp(ename);
使用explain查看select ename,sal from emp where ename=‘JAMES‘;的执行计划。
explain select ename,sal from emp where ename=‘JAMES‘;
当ename字段上添加了索引的时候,以上sql语句会根据索引扫描,快速定位。
2.考虑添加索引的情况
*数据量庞大(根据客户的需求,根据线上的环境)
*该字段的DML操作很少(因为字段进行修改操作,索引也需要维护)
*该字段经常出现在where子句中
注意:主键和具有unique约束的字段自动会添加索引。根据主键的查询效率较高。尽量根据主键查询。
3.创建索引对象,删除索引对象
创建:create index 索引名称 on 表名(字段名);
删除:drop index 索引名称 on 表名;
4.索引底层采用的数据结构是:B Tree
5.索引的实现原理:
通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过所以检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
6.索引的分类:
单一索引:给单个字段添加索引
符合索引:给多个字段联合起来添加一个索引
主键索引:主键上会自动添加索引(根据主键查效率最高,因为永远扫的都是一条记录,因为主键:不为空,不能重复)
唯一索引:有unique约束的字段上会自动添加索引
7.索引失效的情况:使用模糊查询,因为第一个通配符使用的是%
select ename from emp where ename like ‘%A%‘;