索引不是银弹

news2024/9/29 11:33:40

数据库索引:不是银弹

  • 使用环境
  • 索引分类
  • 创建索引的代价
  • 最佳实践
  • 不是所有针对索引列的查询都能使用索引加速查询
    • 索引只能匹配列的前缀
    • 条件涉及函数操作的无法使用索引
    • 联合索引只能匹配左边的列
  • 总结

数据库索引是优化性能的良药,但却不是银弹!!!

近日,一同事突然找到我说,xx,我遇见个奇怪的现象的,增加了好几个索引性能竟然没有变化,奇了怪了。我听完后的第一反应是,我不是应该给你写个索引使用攻略啊?!

使用环境

  • MySQL:5.7.24

  • 引擎:InnoDB

索引分类

分类依据索引名称
按存储分聚簇索引
二级索引
按字段特性分主键索引
普通索引
前缀索引
按字段个数分单列索引
联合索引

Tip:InnoDB会自动使用主键作为表的索引键(如果没有主键,就选择第一个不包含 NULL值的唯一列)。

创建索引的代价

任务事物的背后都是有代价的,索引也不例外。创建额外索引的代价主要表现在:

维护代价

对InnoDB存储引擎来说,创建N个索引,就需要创建对应的N颗B+树,新增数据时不光要修改聚簇索引,还要修改这N个二级索引。

空间存储

二级索引不保存原始数据,但是需要保存索引列的数据,索引会占用多余的数据。

Note:SELECT data_length, index_length FROM information_schema.TABLES WHERE table_name=‘TableName’。

回表代价

二级索引不保存原始数据,通过索引找到主键后需要再查询聚簇索引,才能找到需要的数据。

最佳实践

  1. 一开始无需创建太多的索引(除非你确定数据量比较大),等到需要时,比如性能下降,数据量过万,在对具体的场景进行索引优化。

  2. 创建索引后,最好使用explain命令进行验证和确认语句是否真的使用的创建的索引。

  3. 尽量在比较轻的字段上创建索引,比如能索引int字段,就不要索引varchar字段。

  4. 不要忘记了前缀索引,即针对比较长的字段只对前N个字符创建索引。

  5. 尽量不要在生产环境中使用 select * 语句,最好使用查询具体字段。

  6. 查询字段较少并且数据量特别大时,可以考虑使用全部查询字段的联合索引,这样既能实现索引查询加速,又能避免回表操作。

不是所有针对索引列的查询都能使用索引加速查询

我们回到这位同事是问题上来,我们用一个具体的表来模拟他的情况。

CREATE TABLE `person` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `createTime` timestamp NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

针对表person创建了一个联合索引:

CREATE INDEX name_score ON person(name,score);

索引只能匹配列的前缀

如下图所以,执行计划的type=ALL代表了全表扫描,Extra的值 Using where 也表示使用where语句
explain结果
如下图所以,执行计划的type=range表示走索引扫描,key=name_score 看到实际走了name_score索引
explain结果

条件涉及函数操作的无法使用索引

如下图所以,由于使用了 LENGTH 函数,语句的执行计划type=ALL代表了全表扫描

explain结果

联合索引只能匹配左边的列

这个场景就是同事遇见的场景,虽然对name和score建了联合索引,但是仅按照score列搜索时,InnoDB是无法使用索引的,执行计划给出了结果:

explain结果

其实造成这个的原因也很简单,联合索引是先按照第一列进行排序,第一列相同的数据才会按照第二列进行排序。想让索引跳过第一列,直接使用第二列人眼看也无法解决,还是得按照第二列排序后才能给出合理的答案。问题明确后,解决方案也很简单了:

  1. 只创建针对score列的索引(同事的问题就是使用此方法解决);

  2. 查询条件中加上name字段(很明显这个需要区分场景,这里查询班级分数>80的人,就无法加上name字段了)。

总结

好了,这里就是关于索引的全部内容了,这个故事告诉我们:**不光要使用技术,还要了解一些技术的本质!**祝你技能满满!

Last updated 2024-01-13 06:54:44 +0800

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块一

竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 1.第一阶段:模块一 网络平台搭建与设备安全防护(180 分钟,300 分)。 2.第二阶段:模块二…

Nginx配置负载均衡实例

Nginx配置反向代理实例二 提醒一下:下面实例讲解是在Mac系统演示的; 负载均衡实例实现的效果 浏览器地址栏输入地址http://192.168.0.101/test/a.html,刷新页面进行多次请求,负载均衡效果,平均分配到8080端口服务和8…

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载:Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

python 异常处理 try...except...finally..

python 异常处理: 简单的异常处理主要依靠内置异常处理结构体,代码结构如下: try: … except ValueError as e: # 异常判断,出现ValueError错误时处理机制 … except ZeroDivisionError as e: # 异常判断,出现ZeroDiv…

书生·浦语大模型--第二节课笔记

书生浦语大模型--第二节课 大模型及InternLM基本介绍实战部分demo部署准备工作模型下载代码准备终端运行web demo 运行 Lagent 智能体工具调用 Demo准备工作Demo 运行 浦语灵笔图文理解创作 Demo环境准备下载模型下载代码运行 大模型及InternLM基本介绍 大模型 定义&#xff…

数据结构中的一棵树

一、树是什么? 有根有枝叶便是树!根只有一个,枝叶可以有,也可以没有,可以有一个,也可以有很多。 就像这样: 嗯,应该是这样: 二、一些概念 1、高度 树有多高&#x…

案例117:基于微信小程序的新闻资讯系统设计与实现

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

Spring Boot - Application Events 的发布顺序_ApplicationStartedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

FineBI报表页面大屏小屏自适应显示问题

大屏正常显示 显示正常 小屏BI自适应显示 存在遮挡字体情况 小屏浏览器缩放显示 等比缩放后显示正常

[开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 1. Python中的赋值、浅拷贝、深拷贝2. C中的赋值、浅拷贝、深拷贝2.1 概念2.2 示例:从例子中理解1) 不可变对象的赋值、深拷贝、浅拷贝2) 可变对象的赋值、浅拷贝与深拷贝3) **可变对象深浅拷贝(外层、内层改变元素)** 写在前面&…

Ubuntu server配置ssh远程登录

使用如下命令进行安装 apt-get install ssh 安装好后启动 service ssh start 然后查看运行状态 然后用本机ping虚拟机 关闭本机和虚拟机防火墙 ufw disable 然后打开Xshell进行连接

删除的数据恢复

1回收站恢复 1.1回收站删除 新手删除是通过del键或者鼠标右键删除,这种删除是并不是真正的删除,而是放到了回收站 1.2回收站的数据恢复 回收站的数据,你要恢复那个直接右键还原即可,删除到回收站的数据并不能称得上是删除,回收站的本质也是一个文件夹,只不过是个特殊的文件…

少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(判断题)

2023年12月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、声音Medieval1的长度是9.68秒,运行下列程序1或程序2都能实现,播放声音2秒后,声音停止角色移动100步 答案:对 考点分析:考查积木综合使用,重点考查声音积木的使用 程序1中用的是等待播完…

系统存储架构升级分享 | 京东云技术团队

一、业务背景 系统业务功能:系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。 系统网络架构: 部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响分布式缓存可进行单独扩容, 与存储及查询功能升级无关通过…

掌握 Vue 响应式系统,让数据驱动视图(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

分析一个项目(微信小程序篇)三

目录 接下来分析接口方面: home接口: categories接口: details接口: login接口: 分析一个项目讲究的是如何进行对项目的解析分解,进一步了解项目的整体结构,熟悉项目的结构,能够…

impala元数据自动刷新

一.操作步骤 进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,注意一定要勾选,配置后面的配置不生效。数据库通知的保留时间默认为2天&#…

2-认识小程序项目

基本结构 myapp├─miniprogram┊ └──pages┊ ┊ └──index┊ ┊ ┊ ├──index.json┊ ┊ ┊ ├──index.ts┊ ┊ ┊ ├──index.wxml┊ ┊ ┊ └──index.wxss┊ ┊ └──logs┊ ┊ ├──index.json┊ ┊ ├──index.ts┊ ┊ ├…

评论转换输出 - 华为OD统一考试

OD统一考试 分值: 200分 题解: Java / Python / C 题目描述 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。 评论具有树状结构,除了根评论外,每个评论都有一个父评论。当评论保存时&am…

VMware workstation安装MX-23.1虚拟机并配置网络

VMware workstation安装MX-23.1虚拟机并配置网络 MX Linux是基于Debian稳定分支的面向桌面的Linux发行,采用Xfce作为缺省桌面,是一份中量级操作系统。该文档适用于在VMware workstation平台安装MX-23.1虚拟机。 1.安装准备 1.1安装平台 Windows 11 …