当前位置: 首页 > news >正文

索引失效案例

  • 1.全值匹配我最爱,最左前缀要遵守。
  • 2.带头大哥不能死,中间兄弟不能段。
  • 3.索引列上少计算,范围之后全失效。
  • 4.like 百分写最右,覆盖索引不写*。
  • 5.不等空值还有or,索引失效要少用。
  • 6.字符串引号不可丢,SQL高级也不难。

全值匹配我最爱

全职匹配我最爱指的是,查询的字段按照顺序在索引中都可以匹配到

最佳左前缀法则

使用复合索引,需要遵循最佳左前缀法则,即如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

主键插入顺序 

 

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

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

CREATE TABLE person_info(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   name VARCHAR(100) NOT NULL,
   birthday DATE NOT NULL,
   phone_number CHAR(11) NOT NULL,
   country varchar(100) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_name_birthday_phone_number (name(10), birthday, phone_number)
);  

我们自定义的主键列 id 拥有 AUTO_INCREMENT 属性,在插入记录时存储引擎会自动为我们填入自增的 主键值。这样的主键占用空间小,顺序写入,减少页分裂。  

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

创建索引

CREATE INDEX idx_name ON student(NAME);

 索引优化生效

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name LIKE 'abc%';

索引优化失效 

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';

类型转换导致索引失效 

下列哪个sql语句可以用到索引。(假设name字段上设置有索引)

# 未使用到索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name=123; 
# 使用到索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name='123'

name=123发生类型转换,索引失效。 

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

ALTER TABLE student DROP INDEX idx_name;

ALTER TABLE student DROP INDEX idx_age;

ALTER TABLE student DROP INDEX idx_age_classid;

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.name = 

'abc' AND student.classId>20 ;

 

不等于(!= 或者<>)索引失效 

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

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NULL; 
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NOT NULL;

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

拓展:Alibaba《Java开发手册》

【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。

 

OR 前后存在非索引的列,索引失效 

# 未使用到索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age = 10 OR classid = 100;
#使用到索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age = 10 OR name = 'Abel';

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

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

相关文章:

  • 机器学习笔记 - Albumentations库实现的图像增强功能一览
  • 软考-存储系统
  • 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
  • GAN Step By Step -- Step4 CGAN
  • HackerRank 算法刷题笔记(一),基于Go语言
  • 【Linux篇】第十三篇——信号(概念+信号的产生+阻塞信号+捕捉信号)
  • Android Jetpack系列之MVI架构
  • 十分钟之内实现stack和queue?容器适配器是什么?priority_queue不是队列?
  • 基于Keras实战项目-猫狗熊猫分类大战
  • 基于 Echarts + Python Flask 动态实时大屏( 附代码)
  • 并查集原理及模拟实现
  • 【Redis】大key的处理
  • T-3.2-把Redis当作消息队列合不合适
  • 简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW个人网站制作成品 web网页制作与实现
  • java基于springboot+element的实现医院预约挂号系统 nodejs
  • JavaScript-如何实现克隆(clone)函数
  • 时间复杂度分析经典问题——最大子序列和
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 2017-08-04 前端日报
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Facebook AccountKit 接入的坑点
  • httpie使用详解
  • JS函数式编程 数组部分风格 ES6版
  • Making An Indicator With Pure CSS
  • php的插入排序,通过双层for循环
  • webgl (原生)基础入门指南【一】
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 动态魔术使用DBMS_SQL
  • 汉诺塔算法
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 在Mac OS X上安装 Ruby运行环境
  • nb
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • #微信小程序:微信小程序常见的配置传值
  • (Python第六天)文件处理
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .CSS-hover 的解释
  • .NET大文件上传知识整理
  • .net流程开发平台的一些难点(1)
  • .NET面试题(二)
  • .NET实现之(自动更新)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • /etc/skel 目录作用
  • ;号自动换行
  • @AutoConfigurationPackage的使用
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @font-face 用字体画图标
  • [100天算法】-二叉树剪枝(day 48)
  • [ACTF2020 新生赛]Include