索引相关学习

5 篇文章 0 订阅

目录

索引相关学习

一、索引

二、为什么使用索引

三、索引的应用

1.创建索引

2.创建复合索引

3.创建唯一索引

4.删除索引

四、查询条件优化

1. 避免判断null值

2. 避免不等值判断

3. 避免使用or逻辑

4 . 慎用in和not in逻辑

5. 注意模糊查询

6. 避免查询条件中字段计算

7. 避免查询条件中对字段进行函数操作

8. “=”左边避免表达式运算

9. 组合索引使用

10. exists


索引相关学习

一、索引

           一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。

二、为什么使用索引

个人理解:如果无索引时在查找一个东西时,需要逐条将数据库所有数据都查询一遍,如果存在索引,那么就相当于是一个树形状,先找到树干,在找树的各个节点,这样查询效率会提示

三、索引的应用

1.创建索引

create index 索引名 on 表名(索引字段名)

2.创建复合索引

create index 索引名 on 表名(索引字段名1,索引字段名2...)

3.创建唯一索引

 create unique index 索引名 on 表名(索引字段名)

4.删除索引

drop index 索引名 on 表名

四、查询条件优化

1. 避免判断null值

应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

2. 避免不等值判断

应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

3. 避免使用or逻辑

应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

select id from t where num=1 or num=2

可以使用union all来进行查询来命中索引如:

select id from t where num=1 union all select id from t where num=2

4 . 慎用in和not in逻辑

in 和 not in 也要慎用,否则会导致全表扫描,如:

select id from t1 where num in(select id from t2 where id > 10)

此时外层查询会全表扫描,不使用索引。可以修改为:

select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id

5. 注意模糊查询

下面的查询也将导致全表扫描:【左%号是全局,右%可以支持索引】

select id from t where name like '%abc%'

不要在like条件左边加'%',这样不会走索引模糊查询如果是必要条件时,可以使用

select id from t where name like 'abc%'

6. 避免查询条件中字段计算

应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where num/2=100

可以修改为

select id from t where num=100*2

7. 避免查询条件中对字段进行函数操作

应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

name以abc开头的i

select id from t where substring(name,1,3)='abc'

可以修改为

select id from t where name like 'abc%'

8. “=”左边避免表达式运算

不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

9. 组合索引使用

在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引

否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

10. exists

很多时候用 exists 代替 in 是一个好的选择:

select num from a where num in(select num from b)

修改为

select num from a where exists(select 1 from b where num=a.num)

 

四、参考

https://www.cnblogs.com/coder-lichao/p/10940338.html

https://blog.csdn.net/weiliangliang111/article/details/51333169

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值