mysql索引失效的常见九种原因图文详解

 更新时间:2022年06月01日 11:33:58   作者:book多得  
索引失效这个问题的前提应该是建立了索引,却没有使用到,或者没有完全使用到,下面这篇文章主要给大家介绍了关于mysql索引失效的常见九种原因的相关资料,需要的朋友可以参考下

前言:

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。

  • 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。
  • 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。

大多数情况下都(默认)采用B+ 树来构建索引。只是空间列类型的索引使R- 树,并且MEMORY 表还支持hash 索引。其实,用不用索引最终都是优化器说了算

优化器是基于什么的优化器? 基于cost开销(CostBaseOptimizer) ,它不是基于规则( Rule-BasedOptimizer),也不是基于语义。怎么样开销小就怎么来。另外, SQL 语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系

1.最佳左前缀法则

拓展: Alibaba Java 开发手册》 索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

2.主键插入顺序

 如果此时再插入一条主键值为 9 的记录,那它插入的位置就如下图:

可这个数据页已经满了,再插进来咋办呢?我们需要把当前 页面分裂 成两个页面,把本页中的一些记录移动到新创建的这个页中。页面分裂和记录移位意味着什么?意味着: 性能损耗 !所以如果我们想尽量 避免这样无谓的性能损耗,最好让插入的记录的 主键值依次递增 ,这样就不会发生这样的性能损耗了。         

所以我们建议:让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键, 在插入记录时存储引擎会自动为我们填入自增的主键值。这样的主键占用空间小,顺序写入,减少页分裂。

3.计算、函数、类型转换(自动或手动)导致索引失效

4.范围条件右边的列索引失效

例子:

#创建一个联合索引, 注意字段的顺序
create index idx_age_classid_name on student(age,classid,name);
#执行计划
EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student .age = 30 AND student .classId > 20 AND student .name = 'abc' ;  

#再创建一个联合索引,与上面的索引对比字段顺序变了
create index idx_age_name_classid on student(age,name,classid); 

#再执行一模一样的执行计划
EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student .age = 30 AND student .classId > 20 AND student .name = 'abc' ;

 看到两个执行计划虽然都用到了索引,但是:

  • 第一个没用全,只用到了联合索引“idx_age_classid_name” 的age和classid。
  • 第二个把联合索引“idx_age_name_classid”的age,name和classid都用上了。

5.不等于(!= 或者<>)导致索引失效

6.is null可以使用索引,is not null无法使用索引

7.like以通配符%开头索引失效

拓展: Alibaba 《Java 开发手册》 【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。

8.OR 前后只要存在非索引的列,都会导致索引失效 

9.数据库和表的字符集统一使用utf8mb4         

统一使用utf8mb4( 5.5.3 版本以上支持 ) 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

总结

到此这篇关于mysql索引失效的常见九种原因的文章就介绍到这了,更多相关mysql索引失效原因内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysqli基础知识

    Mysqli基础知识

    本文给大家讲述的是Mysqli的基础知识,非常的浅显易懂,有需要的小伙伴就可以参考下。
    2015-07-07
  • InnoDB数据库死锁问题处理

    InnoDB数据库死锁问题处理

    本文给大家讲解的是mysql数据库InnoDB类型,在update表的时候出现死锁现象的原因及解决办法,有需要的小伙伴可以参考下。
    2016-03-03
  • 深入了解MySQL中分区表的原理与企业级实战

    深入了解MySQL中分区表的原理与企业级实战

    本文详细讲解什么是分区表,分区表增删改查的工作原理以及分区表的实战,分区表的场景有哪些,哪些场景不建议用分区表,并列举出六点使用分区表的误区,需要的可以参考一下
    2022-11-11
  • 基于python的mysql复制工具详解

    基于python的mysql复制工具详解

    python-mysql-replication 是基于python实现的 MySQL复制协议工具,我们可以用它来解析binlog 获取日志的insert,update,delete等事件 ,并基于此做其他业务需求。这篇文章主要介绍了基于python的mysql复制工具,需要的朋友可以参考下
    2019-06-06
  • MySQL跨服务器数据映射的实现

    MySQL跨服务器数据映射的实现

    本文主要介绍了MySQL跨服务器数据映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL备份恢复设计思路

    MySQL备份恢复设计思路

    这篇文章主要介绍了MySQL备份恢复设计思路,帮助大家更好的维护数据库,感兴趣的朋友可以了解下
    2020-10-10
  • mysql 5.7.17 winx64安装配置方法图文教程

    mysql 5.7.17 winx64安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.17winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MySQL数据库远程访问权限如何打开(两种方法)

    MySQL数据库远程访问权限如何打开(两种方法)

    本文通过两种方法给大家介绍MySQL数据库远程访问权限的打开方法,非常不错,实用性非常高,感兴趣的朋友一起看看吧
    2016-05-05
  • MySQL慢查询查找和调优测试

    MySQL慢查询查找和调优测试

    MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下
    2013-01-01
  • mysql中的不等于实例详解

    mysql中的不等于实例详解

    这篇文章主要介绍了mysql中的不等于实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论