索引
学习索引之前,我们需要先理解以下的一些问题
- 索引相当于是什么?
索引就相当于是一本书的目录 - 索引的作用是什么?
如果使用索引恰当的话,可以极大的增加sql查询速度 索引的副作用是什么?
如果使用了索引的话,那么表增删的效率会有所降低,因为增加跟删除数据库都要计算,索引的底层是怎么实现的?
索引底层是用B树做的,也可以称为B+树实现的
语法
create index index_name on table_name(‘列名’);
学习索引之前,我们需要创建数据,因为少量的数据是体现不出索引的优势的,我们就创建一个五百万条数据的表吧,
我们使用 plsql来填充数据,
declare
i number := 1;
begin
loop
exit when i > 5000000;
insert into t_user values(seq_user.nextval,'值i=:'||i);
i := i+1;
end loop;
commit;
end;
那个,要是电脑性能不是很好的,,,弄50万 100万就行,,别跟电脑过不去,
需要注意的是,表的数据字段长度设置大一点,否则会报错,
那么我们开始查询
首先我们使用主键来查询,
实际上看执行时间是不准的,我们一般分析sql语句是否需要优化,我们需要通过sql的执行计划来判断
我们可以判断,我们刚刚的sql语句基本是没有问题的,但是我们明明没有创建索引,但是为什么会显示使用了索引呢??? 这主要是因为主键自带索引,
那么我们为了凸显索引的作用,我们就不使用索引列查询,
我们通过执行计划来分析这条语句
跟我们刚刚的比起来,Cost消耗了太多太多,那么我们就需要解决这个问题了,
创建索引可能会有点慢,这是正常的,
然后我们再来执行刚刚的sql语句
主要是看执行计划,如果是mysql的话
explain sql语句 , 就可以查看执行计划了
如果是oracle,那么F5就行,
这条语句其实就差不多没什么问题了,但是千万要记住,索引并不是越多越好,尽量少创建索引,
然后我们总结一下哪些情况需要创建索引
创建索引的情况
- 主键约束默认建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 多表查询中经常与其它表建立关系,外键字段建立索引
- 查询中经常用来排序的字段
- 查询中经常用来统计或者分组字段
说白了,就是需要经常用来查询的字段
不创建索引的情况
- 频繁更新的字段: 每次更新都会影响索引树
- where 条件用不到的字段
- 数据太少的表
- 重复的记录多,也不用创建字段,因为没有多大的意义
索引失效
以下情况会发生索引失效
- 数据库执行的过程中进行了其它操作,如数据类型转换,解决的办法是跟数据库接触的字段使用封装数据类型
- 最佳左前缀法则: 如果索引了多列,要遵循最左前缀法则. 查询从索引的最左列开始并且不跳过索引中的列
- 存储引擎不能使用索引中范围条件右边的列
- mysql在使用不等于条件判断的时候,索引会失效引发全表扫描
- is null, is not null 索引会失效,无法使用索引
- like以通配符开头(‘%xxx…’)索引会失效,导致全表扫描
- 少用or,它会导致索引失效
- 字符串不加单引号索引失效
索引主要就讲到这里,主要是入门,,,