Mysql 索引查询失效的情况


首先,复习一下索引的创建:

普通的索引的创建:

CREATE INDEX  (自定义) 索引名  ON  数据表 (字段);

复合索引的创建:

CREATE INDEX  (自定义) 索引名  ON  数据表 (字段,字段,。。。);

删除索引:DROP INDEX 索引名;

以下通过 explain 显示出 mysql 执行的字段内容:

  • id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.

  • select_type: SELECT 查询的类型.

  • table: 查询的是哪个表

  • partitions: 匹配的分区

  • type: join 类型

  • possible_keys: 此次查询中可能选用的索引

  • key: 此次查询中确切使用到的索引.

  • ref: 哪个字段或常数与 key 一起被使用

  • rows: 显示此查询一共扫描了多少行. 这个是一个估计值.

  • filtered: 表示此查询条件所过滤的数据的百分比

  • extra: 额外的信息

索引查询失效的几个情况:

1、like 以 % 开头,索引无效;当 like 前缀没有 %,后缀有 % 时,索引有效。

2、or 语句前后没有同时使用索引。当 or 左右查询字段只有一个是索引,该索引失效,只有当 or 左右查询字段均为索引时,才会生效

3、组合索引,不是使用第一列索引,索引失效。

4、数据类型出现隐式转化。如 varchar 不加单引号的话可能会自动转换为 int 型,使索引无效,产生全表扫描。

5、在索引列上使用 IS NULL 或 IS NOT NULL 操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于 0,字符串类型设置一个默认值,判断是否等于默认值即可。(此处是错误的!

解释以上错误:

此处我将重新创建一个 emp 表

创建新的索引

查看索引

执行 SQL 语句

由此可发现有使用到索引

总结:在索引列上使用 IS NULL 或 IS NOT NULL 操作,索引不一定失效!!!

6、在索引字段上使用 not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。

7、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))

8、当全表扫描速度比索引速度快时,mysql 会使用全表扫描,此时索引失效。

索引失效分析工具:

可以使用 explain 命令加在要分析的 sql 语句前面,在执行结果中查看 key 这一列的值,如果为 NULL,说明没有使用索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL索引失效情况有以下几种: 1. 数据量过小:当表中记录的数量较少时,使用索引可能会变得不必要,因为MySQL可能会选择全表扫描而不是使用索引。这种情况下,索引就会失效。 2. 不适当的索引设计:如果索引的设计不合理,那么它可能无法有效地支持查询。例如,如果索引列的选择不合适,或者多个列被组合在一个索引中,但查询只使用了其中一部分列,索引就会失效。 3. 使用了函数或表达式:如果在查询中使用了函数或表达式,并且该函数或表达式无法使用索引进行优化,那么索引可能会失效。例如,如果在WHERE子句中使用了函数操作符,或者将列的值与一个常量进行比较,索引可能就不会被使用。 4. 数据类型不匹配:如果索引列和查询中的条件列具有不同的数据类型,那么索引可能会失效。例如,如果索引列是字符串类型,而查询中的条件列是数字类型,索引就不会被使用。 5. 数据分布不均衡:如果数据在索引列上的分布不均衡,即某些值出现频率较高,而其他值出现频率较低,那么索引可能会失效。这是因为MySQL可能认为全表扫描比使用索引更高效。 要避免索引失效,可以通过以下方法进行优化: - 确保正确选择和设计索引,根据查询的需求创建合适的索引。 - 避免在查询中使用不必要的函数或表达式。 - 确保索引列和查询中的条件列具有相同的数据类型。 - 定期更新统计信息,以帮助MySQL优化查询计划。 - 使用合适的数据类型和数据分布,以避免数据倾斜。 这些是一些常见的导致MySQL索引失效情况和优化方法。根据具体情况进行分析和调整,可以提高查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据搜集者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值