mysql的索引失效

一、成功的索引优化

1.表数据如下:

2.查询语句如下:

explain select id, age, level from employee where dpId = 1 and age = 30 order by level

Extra: Using where; Using filesort

出现了Using filesort需要进行优化。方法很简单,为查询,分组或排序的字段建索引即可。

3.建索引优化:

create index idx_employee_dla on employee(dpId, age, level)

再次查询结果如下,type为ref,使用到了索引key,Extra为Using Where; Using index,优化成功:

二、跳过中间索引,使索引失效

索引的顺序为 id, dpId,age,level,查询时跳过age索引或使用>,<,<>,!=条件查询age索引



Extra出现Using filesort,索引失效,需要优化。

三、查询字段加入非索引字段,使索引失效

userName为非索引字段,当查询userName字段时,Extra为:Using index condition

四、使用>, <, <>, != 使索引失效


原文地址:http://blog.51cto.com/12874079/2149404

时间: 2024-11-09 10:28:51

mysql的索引失效的相关文章

一张图搞懂MySQL的索引失效

全值匹配(索引最佳) explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '18730658760'; 和索引顺序无关,MySQL底层的优化器会进行优化,调整索引的顺序 explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '187306

Mysql防止索引失效原则

防止索引失效原则 1.当你使用索引的时候,最好能够把你建立的索引的字段都给用到.不仅可以提供查询的效率.2.最佳左前缀法则,意思就是当你如果有建立过多个字段索引的组合索引的时候,最要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不能跳过索引中的列.原则: 第一个索引不能掉 中间索引不能掉 3.不在索引列上做任何操作(计算.函数(自动or手动)类型转换),会导致索引失效而转向全表扫描.4.存储引擎不能使用索引中范围右列的列,范围之后索引全失效.5.尽量使用覆盖索引(只访问索引的查询(索引列和

MySQL高级 之 索引失效与优化详解

案例所用的表结构.索引.与数据如下:   索引失效与优化 1.全值匹配我最爱 2.最佳左前缀法则(带头索引不能死,中间索引不能断) 如果索引了多个列,要遵守最佳左前缀法则.指的是查询从索引的最左前列开始 并且 不跳过索引中的列. 正确的示例参考上图. 错误的示例: 带头索引死:  中间索引断(带头索引生效,其他索引失效):  3.不要在索引上做任何操作(计算.函数.自动/手动类型转换),不然会导致索引失效而转向全表扫描 4.mysql存储引擎不能继续使用索引中范围条件(bettween.<.>

MySQL表字段字符集不同导致的索引失效问题

1. 概述 昨天在一位同学的MySQL机器上面发现了这样一个问题,MySQL两张表做left join时,执行计划里面显示有一张表使用了全表扫描,扫描全表近100万行记录,大并发的这样的SQL过来数据库变得几乎不可用了,今天和大家一起分享下这个问题的原因及解决办法,希望可以帮助大家更好的学习MySQL数据库,一起来看看吧.MySQL版本为官方5.7.12. 2. 问题重现 首先,表结构和表记录如下: mysql> show create table t1\G ******************

【转-mysql索引失效的几种情形】

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用的第一部分(第一个),则不会使用索引 3.like查询是以%开头 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 5.如果MySQL估计使用全表扫描要比使用索引快,则不使用索引 此外,查看索引的使用情况show stat

MySQL索引失效的几种情况

1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描. 为什么索引列不能存Null值? 将索引列值进行建树,其中必然涉及到诸多的比较操作.Null值的特殊性就在于参与的运算大多取值为null. 这样的话,null值实际上是不能参与进建索引的过程.也就是说,null值不会像其他取值一样出现在索引树的叶子节点上. 2.不适合键值较少的列(重复

MySQL优化(5):索引失效分析、in与exists使用场合

一.索引失效的情况 前文提及过可以通过explain的possible_keys.key属性判断索引是否失效,key如果为null,可能是索引没建,也可能是索引失效,下面列举一些会使索引失效的情况. 1.全值匹配:顺序.个数与索引一致 2.最佳左前缀法则:查询从索引的最左前列开始并且不跳过索引中的列,中间跳过的值,后面的索引会失效 3.索引列上做了操作(计算.函数.自动或手动类型转换),会导致索引失效而转向全表扫描 4.存储引擎不能使用索引中范围条件右边的列 name字段用于查找,age>11也

Mysql 索引失效场景

例如:一张USER表   有字段属性 name,age   其中name为索引 下面列举几个索引失效的情况 1. select * from USER where name=‘xzz’ or age=16: 例如这种情况:当语句中带有or的时候 即使有索引也会失效. 2.select *  from  USER where name like‘%xzz’ : 例如这种情况:当语句索引 like 带%的时候索引失效(注意:如果上句为 like‘xzz’此时索引是生效的) 3.select * fr

MySQL性能优化:MySQL中的隐式转换造成的索引失效

数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的. 于数据库层面,最常见的恐怕就是索引失效了,且一开始因为数据量小还不易被发现.但随着业务的拓展数据量的提升,性能问题慢慢的就体现出来了,处理不及时还很容易造成雪球效应,最终导致数据库卡死甚至瘫痪.造成索引失效的原因可能有很多种,相关技术博客已经有