当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- Linux CentOS8安装Redis6
- Point Density-Aware Voxels for LiDAR 3D Object Detection Paper Notes
- Nacos注册中心的部署与用法详细介绍
- Home NAS server (4) | MergerFS and SnapRaid data backup
- Practice on optimizing startup performance of VS Code
- HCIP BGP综合实验 建立对等体、路由反射器、联邦、路由宣告及聚合
- Guarantee WIFI security in home and enterprise-with AC and AP networking experiment
- BGP+MPLS Comprehensive Experiment
- Difference and analysis of CPU usage and load
- Analysis of port 9848 error at startup of Nacos client (non-version upgrade problem)
猜你喜欢

APT + Transform to realize multi module Application distributed Application life cycle

Kingdee International: Lost in half a year and last year, how does the business model of frantically burning money continue

There are more and more talents in software testing. Why are people still reluctant to take the road of software testing?

引领需求 为HR价值正名——“人力资源领先模型HRLM”成功首发

科技赋能拉萨之“肺”,华为助力拉鲁湿地智慧管理守护绿水青山

金山云团队分享 | 5000字读懂Presto如何与Alluxio搭配

C语言操作符详解(2)

BGP+MPLS Comprehensive Experiment

【解决】RESP.app 连接不上redis

金蝶国际:半年亏掉去年一年,疯狂烧钱的商业模式如何持续
随机推荐
leetcode-338.比特位计数
点云旋转到参考坐标系方向(最小方向包围盒方法)
字节面试题:如何保证缓存和数据库的一致性
深度学习——CNN实现MNIST手写数字的识别
Point Density-Aware Voxels for LiDAR 3D Object Detection 论文笔记
Linux CentOS8安装Redis6
A list of 300+ learning resources compiled by senior engineers of the Tao Department (the latest version in 2021)
C语言基础知识梳理总结:零基础入门请看这一篇
使用jOOQ 3.14合成外键在视图上写隐式连接
分布式文件存储服务器之Minio对象存储技术参考指南
Analysis of port 9848 error at startup of Nacos client (non-version upgrade problem)
Thread Basics (1)
The advantages of making web3d dynamic product display
[OpenCV from entry to practice] image processing technology [pixel] (the most detailed in the whole network)
人工神经网络
卸载redis
Machine learning -- - theory of support vector machine (SVM)
触发器简单解释
【漫画】2021满分程序员行为对照表(最新版)
Contents of encoding-indexes.js file printed with Bluetooth: