【笔记】数据库索引用法

数据库索引用法

索引类型

普通索引,唯一索引(唯一索引要求字段中不会出现重复数据),复合索引(将多个字段组合起来作为索引,必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。)。

索引使用

建立索引:

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

建立唯一索引:

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

建立复合索引:

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

查看表中索引:

show index from 表名

删除索引:

drop index 索引名 on 表名

查看索引是否命中

Mysql:当结果的type为 index时索引命中

explain +sql语句

Oracle:

explain plan for+sql语句

explain plan for+sql语句

索引命中

1. 避免判断null值

应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(可以设置默认值,比如0,确保没有null值,然后设置条件等于0)

2. 避免不等值判断

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

3. 避免使用or逻辑

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

4 . 慎用in和not in逻辑

in 和 not in 也要慎用,否则会导致全表扫描。此时外层查询会全表扫描,不使用索引,可以修改为,两个查询连接。(where and t1.id = t2.id)

5. 注意模糊查询

like ‘%abc%‘也将导致全表扫描,不要在like条件左边加’%’,这样不会走索引模糊查询如果是必要条件时,可以使用 like ‘abc%’ 来实现模糊查询,此时索引将被使用。如果头匹配是必要的,可以使用elasticsearch等全文搜索引擎。

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

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

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

应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如,where substring(name,1,3)=‘abc’ , 应改为,where name like ‘abc%’

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

9. 组合索引使用

在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

10. exists

很多时候用 exists 代替 in 是一个好的选择:
where num in(select num from b) 应该为,where exists(select 1 from b where num=a.num)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值