索引使用注意事项,索引不可用的几种情况


哪些情况下不需要使用索引

1、数据唯一性差的字段不要使用索引

比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

2、频繁更新的字段不要使用索引

比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。

3、字段不在where语句出现时不要添加索引

只有在where语句出现,mysql才会去使用索引

4、数据量少的表不要使用索引,使用了改善也不大

5、如果mysql估计使用全表扫描要比使用索引快,则不会使用索引。

索引不可用的情况

where子句中的条件列上是建了索引的,那为什么执行计划会显示全表扫描呢?先看一下表字段定义:

作为条件的字段是varchar,而SQL语句中的条件是一串数字!

这样的话就会造成索引不可用,处理方法也很简单,加上一对单引号就可以了。为什么呢?因为MySQL做了隐性数据转换,把数字类型转换成字符串类型,而索引列如果被操作就不会试用索引。

以下几种情况索引不会被使用

1、不等于操作不能用于索引

2、经过普通或者函数运算的索引列不能使用索引

3、含前向模糊查询(通配符%在搜索词首出现),比如“like %王xx”【反向键索引:reverse】

4、索引列为空,或有记录包含空值

5、数值比较时左右类型不同,相当于做了隐式类型转换

6、给索引查询的值是未知字段,而不是已知数

注意:

1、通配符放在后面不一定就能走索引,因为这时对索引是一个范围扫描,如果oracle/MySQL通过统计数据认为这个范围比较大,那么走索引得到的代价评估值就更大,这时就不会选择走索引。

2、如果通配符放在前面,oracle/MySQL几乎可以肯定是不会选择走索引的(除非oracle/MySQL确定该sql只需要访问该索引而不需要访问表)。因为这时必须是索引全扫描,而全扫描索引本身就会消耗大量 资源,然后再根据得出的rowid(很有可能也很多)去扫描表又要消耗大量资源,这个查询总共消耗的资源很可能会比直接扫描全表慢很多。

3、如果你认为自己比oracle/MySQL更了解自己的查询语句和数据分布情况,你确定更多情况走索引是正确的,那就使用hint强制要求走索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发者导航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值