当前位置:网站首页>mysql索引失效的常见9种原因详解
mysql索引失效的常见9种原因详解
2022-08-02 05:19:00 【饿饿好饿】
目录
6.is null可以使用索引,is not null无法使用索引
前言:
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安装到mysql高级,强!硬!》系列课程。
所以本文章看不懂的卷王们可以去搜索宋红康老师的mysql系列课程。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- There are more and more talents in software testing. Why are people still reluctant to take the road of software testing?
- pytorch基本操作:使用神经网络进行分类任务
- 保证家里和企业中的WIFI安全-附AC与AP组网实验
- Node的安装与环境变量的配置
- Meta公司内部项目-RaptorX:将Presto性能提升10倍
- BGP experiment (route reflector, federation, route optimization)
- Mysql数据库 | 基于Docker搭建Mysql-8.0以上版本主从实例实战
- eggjs controller层调用controller层解决方案
- 深入剖析成员变量和局部变量的初始化问题
- MySQL数据表的基本操作和基于 MySQL数据表的基本操作的综合实例项目
猜你喜欢

BGP+MPLS Comprehensive Experiment
![[Cartoon] 2021 full score programmer behavior comparison table (latest version)](/img/18/2679b35f39b909aa6e013ddf01114b.png)
[Cartoon] 2021 full score programmer behavior comparison table (latest version)

【漫画】2021满分程序员行为对照表(最新版)

nacos registry

Nacos注册中心的部署与用法详细介绍

The international top conference OSDI included Taobao system papers for the first time, and the device-cloud collaborative intelligence was recommended by the keynote speech of the conference

npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

家用 NAS 服务器(4)| MergerFS和SnapRaid数据定时备份

关于鸿蒙系统 JS UI 框架源码的分析

The advantages of making web3d dynamic product display
随机推荐
上海交大牵手淘宝成立媒体计算实验室:推动视频超分等关键技术发展
npm、cnpm的安装
反向解析dns服务器
深度学习——CNN实现MNIST手写数字的识别
Nacos installation configuration and single-machine deployment tutorial
Polar Parametrization for Vision-based Surround-View 3D Detection Paper Notes
About the directory structure of the web application
Machine learning -- - theory of support vector machine (SVM)
APT + Transform 实现多模块应用Application生命周期分发
引领需求 为HR价值正名——“人力资源领先模型HRLM”成功首发
A list of 300+ learning resources compiled by senior engineers of the Tao Department (the latest version in 2021)
npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
【OpenCV从入门到实践】图像处理技术[像素](全网最详细)
VMTK环境配置记录
Node installation and configuration of environment variables
保证家里和企业中的WIFI安全-附AC与AP组网实验
Important concepts of target detection - IOU, receptive field, hole convolution, mAP
5款经典代码阅读器的使用方案对比
npm、nrm两种方式查看源和切换镜像
Differences between i++ and ++i in loops in C language