sql优化之索引失效

我们在自己建立数据库索引时,有时候索引会失效,导致数据库性能下降,那么,我们如何避免索引失效呢,就要先知道什么时候索引失效。并且避免它,对它进行优化,提高数据库性能。

1.不遵守最佳作前缀法导致索引失效

1.1全值匹配
建立一个多值索引:

-- create index ind_x_name_department_age on employee (name,depart_id,age);

#全值匹配是最好的匹配效果 不会造成索引失效

explain select * from employee where name='孙尚香' and depart_id=1 and age=20;

sql server索引报错 sql索引失效_sql server索引报错


1.2最佳左前缀法:

建立索引多列时,索引从左列开始,并且不跳过索引的列(顺序可以乱),若跳过第一个字段时,索引失效,来看例子 :上面表建立了name,depart_id,age的多值索引。全值索引 key_len=73 只用到两个字段 key_len=68 只用到一个字段key_len=63

全值索引时key_len=73:

sql server索引报错 sql索引失效_mysql_02

a.跳过中间一个字段depart_id时:只用到一个字段的索引值(key_len=63 ):

sql server索引报错 sql索引失效_字段_03

b.跳过第一个时索引失效(key_len=0):

sql server索引报错 sql索引失效_mysql_04

c.跳过前俩个时索引失效(key_len=0):

sql server索引报错 sql索引失效_mysql_05

2.在索引列上做(计算,函数,类型转换)操作导致索引失效

1.使用函数

sql server索引报错 sql索引失效_java_06

3.查询范围条件右边索引失效:

当索引出现条件范围时右边的索引列失效:

sql server索引报错 sql索引失效_数据库_07

4.查询条件符号导致索引失效

1.使用(!= ,<,>)无法使用索引,导致全表扫描。

sql server索引报错 sql索引失效_java_08


2.使用is not null 无法使用索引,导致全表扫描。

sql server索引报错 sql索引失效_java_09

3.or连接时索引失效,导致全表扫描。

sql server索引报错 sql索引失效_字段_10

4.like 以通配符在最前面(%qq)索引失效,

sql server索引报错 sql索引失效_java_11

5.属性字符串不用单引号 ,变成全表扫描。

a.使用了引号,使用到了索引:

sql server索引报错 sql索引失效_字段_12


b.未使用引号,导致索引失效,变成全表扫描:

sql server索引报错 sql索引失效_字段_13


那么,如何解决上诉问题呢。使用覆盖索引

覆盖索引:查询的字段与建立索引字段刚好符合,只需扫描索引而无须回表。

1.like 以通配符在最前面(%qq)索引失效,导致全表扫描

sql server索引报错 sql索引失效_mysql_14

2.使用覆盖索引,扫描类型type为index索引扫描,解决like‘+%’导致索引失效问题

sql server索引报错 sql索引失效_mysql_15

只扫描索引而无需回表的优点:
1.索引条目通常远小于数据行大小,只需要读取索引,极大地减少数据访问量。
2.索引是按照列值顺序存储,对于IO密集的范围查找会比随机读取每一行数据的IO少。