MySQL 索引(二)

1. 不同存储引擎的索引结构

MySQL5.5版本之前默认采用的是MyISAM引擎,5.5之后默认采用的是Innodb引擎。

1.1. MyISAM存储引擎

  • MYD文件:数据文件,所有的数据保存在这个文件中。
  • MYI文件 :索引文件。

  • 如果要查询id = 40的数据:
  • 先根据MyISAM索引文件(user_myisam.MYI)去找id = 40的节点,通过这个节点的数据区拿到真正保存数据的磁盘地址,再通过这个地址从MYD数据文件(user_myisam.MYD)中加载对应的记录。

如果有多个索引,在MyISAM存储引擎中,主键索引 普通索引(辅助索引)是同级别的,没有主次之分。 

5.2. InnoDB存储引擎

Innodb主键索引是一个聚集索引

聚集索引的概念:数据库表行中数据的物理顺序和键值的逻辑顺序相同。所以,叶子节点的数据区保存的就是真实的数据,在通过索引进行检索的时候,命中叶子节点,就可以直接从叶子节点中取出行数据。

如果有多个索引,在Innodb存储引擎中,主键索引的叶子节点保存的是真正的数据。而辅助索引叶子节点的数据区保存的是主键索引关键字的值。

假如要查询name = C 的数据,其搜索过程如下:

  1. 先在辅助索引中通过C查询最后找到主键id = 9.
  2. 在主键索引中搜索id=9的数据,最终在主键索引的叶子节点中获取到真正的数据。
  3. 所以通过辅助索引进行检索,需要检索两次索引。

5.3. B+Tree索引在Innodb 和 在MYISAM的区别

数据存储位置不同。

2.索引失效

        索引可以提高查询的速度,但并不是使用带有索引的字段查询时,索引都会起作用。使用索引有几种特殊情况,在这些情况下,有可能使用带有索引的字段查询时,索引并没有起作用,下面重点介绍这几种特殊情况。

通过使用EXPLAIN语句,观察SQL执行计划,检查索引是否生效。

2.1.查询语句中使用LIKE关键字

-- 创建索引
CREATE INDEX index_zhongwenpianming ON north_american_box_office(zhongwenpianming);
-- 成功索引使用等号ref
EXPLAIN SELECT * FROM north_american_box_office
WHERE zhongwenpianming = '狮子王';

type查询类型ref表示使用索引查询,key使用的索引名称。

-- 占位符开头 索引失效all
EXPLAIN SELECT * FROM north_american_box_office
WHERE zhongwenpianming LIKE '%狮';

all表示使用全表查询,索引失效。

-- 内容开头  索引成功range
EXPLAIN SELECT * FROM north_american_box_office
WHERE zhongwenpianming LIKE '狮%';

2.2. 查询语句中使用多列索引

        多列索引是在表的多个字段上创建一个索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。

示例:north_american_box_office表中的shangyingtianshu字段和leijipiaofang字段添加多列索引index_tianshu_piaofang

CREATE INDEX index_tianshu_piaofang ON north_american_box_office(shangyingtianshu, leijipiaofang);

-- 使用到第一字段 索引有效

EXPLAIN SELECT * FROM north_american_box_office
WHERE (shangyingtianshu BETWEEN 9 AND 13) AND leijipiaofang >=3000

 -- 无第一字段内容 索引失效
EXPLAIN SELECT * FROM north_american_box_office
WHERE leijipiaofang >=3000 

 -- 内容过多 走全表查 索引失效
EXPLAIN SELECT * FROM north_american_box_office
WHERE shangyingtianshu >= 9 AND leijipiaofang >=3000

该索引失效的原因是MySQL在优化器阶段,发现全表扫描比走索引效率更高,因此就放弃使用索引。当MySQL发现通过索引扫描的行记录数超过全表的10%-30%时,优化器可能会放弃走索引,自动变成全表扫描。

类似的问题,在进行范围查询(比如><>=<=in等条件)时往往会出现上述情况。

 2.3. 查询语句中使用OR关键字

        查询语句只有 OR 关键字时,如果 OR 前后的两个条件的列都是索引,那么查询中将使用索引。如果 OR 前后有一个条件的列不是索引,那么查询中将不使用索引。

-- 索引失效
EXPLAIN SELECT * FROM north_american_box_office
WHERE zhongwenpianming LIKE '狮%' OR leijipiaofang BETWEEN 90 AND 100

         虽然OR关键字前的第一个条件中的字段zhongwenpianming虽然存在索引,但是由于多列索引index_tianshu_piaofang并不包含leijipiaofang字段,导致OR关键字后面的条件不存在索引,所以导致整条SQL语句的索引失效。

2.4. 查询语句中使用函数

查询语句中使用函数时,会造成查询中将不使用索引。

EXPLAIN SELECT * FROM north_american_box_office
WHERE length(zhongwenpianming) = 9

 

3. 索引选择

3.1.列的离散性

离散性计算公式:count(distinct column_name):count(*),即:去重后的列值个数 VS 总个数。

        离散度越高,选择性越好。因为离散度越高,通过索引最终确定的范围越小,最终扫描的行数也就越少,索引效率也就越高。

3.2. 为经常需要排序、分组和联合操作的字段建立

        经常需要 ORDER BYGROUP BYDISTINCT UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。

3.3. 为常作为查询条件的字段建立索引

        如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。

3.4. 限制索引的数目

        索引的数目不是“越多越好”。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。在修改表的内容时,索引必须进行更新,有时还可能需要重构。因此,索引越多,更新表的时间就越长。

        注意避免冗余索引 ,冗余索引指的是索引的功能相同,能够命中索引(a, b)就肯定能命中索引(a) ,那么索引(a)就是冗余索引。例如:(name,city)(name)这两个索引就是冗余索引,能够命中前者的查询肯定是能够命中后者的。

3.5. 数据量小的表最好不要使用索引

由于数据较小,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

3.6. 尽量使用前缀来索引

        如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXTBLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

3.7. 删除不再使用或者很少使用的索引

        表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。应该定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源分布式存储系统(HDFS、Ceph)架构分析

文章目录 中间控制节点架构-HDFSNameNode节点分析DataNode节点分析SecondNameNode节点分析Client分析 完全无中心架构-CephCeph Monitor分析Ceph OSD分析Ceph Manager分析Ceph Clients分析 小结HDFS优点缺点 Ceph优点缺点 参考 中间控制节点架构-HDFS 以HDFS&#xff08; Hado…

Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题 1、起手试探 &#xff08;主要看看输入什么内容有正确的回显&#xff09; 1 0 1 1 # 发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显&#xff0c;所以这题就要尝试堆叠注入了。 ps&#xff1a;&#xff08;如果想尝试其他注入方法…

多目标优化算法:基于非支配排序的海象优化算法(NSWOA)MATLAB

一、海象优化算法WOA 海象优化算法&#xff08;Walrus Optimization Algorithm&#xff0c;WOA&#xff09;由Trojovsk等人于2023年提出&#xff0c;该算法模拟海象的进食&#xff0c;迁移&#xff0c;逃跑和对抗捕食者的过程&#xff0c;WOA包含探索、迁移和开发三个阶段&…

许战海战略文库|无增长则消亡:大型制造集团增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。在过去的100年里,全球经济周期的时间长度明显缩短,周期内的波动也更为剧烈。联合国教科文组织的研究表明&#xff0c;18世纪知识更新的周期约为80到…

兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场

项目说明 兔兔答题是用户端基于uniapp开发支持多端适配&#xff0c;管理端端采用TypeScriptVue3.jselement-plus&#xff0c;后端采用THinkPHP6PHP8Golang开发的一款在线答题应用程序。 问题反馈 线上预览地址 相关问题可以通过下方的二维码&#xff0c;联系到我。了解更多 …

《golang设计模式》第二部分·结构型模式-06-享元模式(Flyweight)

文章目录 1. 概述1.1角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图示例 1. 概述 享元&#xff08;Flyweight&#xff09;模式采用共享方式向客户端提供数量庞大的细粒度对象。 所谓细粒度对象&#xff0c;是指实现了业务细节并相互独立的对象。细粒度对象是一种相对概念&…

QT---day3---9.19

1> 完成文本编辑器的保存工作 ui界面&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QMessageBox> #include <QColor> #include <QColorDialog> #include <QFo…

电工三级证(高级)实战项目:信号交通灯的PLC控制

实训目的 掌握比较指令掌握时钟指令掌握时间同步的方法 控制要求 PLC设备:Siemens S7-200 要求:按下起动按钮SB1后&#xff0c;东西方向绿灯亮20s&#xff0c;之后再闪烁绿灯3s&#xff0c;之后黄灯亮3s&#xff0c;最后红灯亮26s&#xff1b;同时&#xff0c;南北方向红灯亮…

【链表】K 个一组翻转链表-力扣 25 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践&#xff0c;帮助开发者构建强大的知识付费平台&#xff0c;提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前&#xff0c;首要任务是选择适当的技术栈。这包括…

【解决Win】“ 无法打开某exe提示无法成功完成操作,因为文件包含病毒或潜在的垃圾软件“

在下载某个应用程序&#xff0c;打开时出现了“无法成功完成操作因为文件包含病毒或潜在垃圾”的提示&#xff0c;遇到这个情况怎么解决&#xff1f; 下面为大家分享故障原因及具体的处理方法。 故障原因 是由于杀毒 防护等原因引起的。 解决方案 打开Windows 安全中心 选择…

BUU [HCTF 2018]Hideandseek

BUU [HCTF 2018]Hideandseek 考点&#xff1a; 软连接读取任意文件Flask伪造session/proc/self/environ文件获取当前进程的环境变量列表random.seed()生成的伪随机数种子MAC地址(存放在/sys/class/net/eth0/address文件) 国赛的时候遇见过软连接&#xff0c;这次再来学习一下…

方案:基于AI烟火识别与视频技术的秸秆焚烧智能化监控预警方案

一、方案背景 为严控秸秆露天焚烧&#xff0c;改善环境空气质量&#xff0c;各省相继发布秸秆禁烧工作内容。以安徽省为例&#xff0c;大气污染防治联席会议下发了该省2020年秸秆禁烧工作部署通知。2020年起&#xff0c;气象局将对全省秸秆焚烧火点实施卫星全年全时段监测&…

指针笔试题讲解(让指针变得简单易懂)

数组名的理解 : 数组名就是首元素地址 但是有两个例外&#xff1a; 1. sizeof&#xff08;数组名&#xff09;这里的数组名表示整个数组的大小&#xff0c;sizeof&#xff08;数组名&#xff09;计算的是整个数组的大小&#xff0c;单位是字节 2. &数组名 这里的数组…

9月19日作业

完成文本编辑器的保存工作-代码&#xff1a; void Widget::on_pushButton_4_clicked() {//创建保存文件对话框QString filename QFileDialog::getSaveFileName(this,"保存文件","./","All(*.*);;Text files (*.txt)");//创建一个文件对象&…

福建厦门航空飞机发动机零部件检测3D测量尺寸偏差比对-CASAIM中科广电

航空航天是一个创新型发展国家的尖端命脉&#xff0c;代表着一个国家科学技术的先进水平。在航空航天工业的发展和组成领域中&#xff0c;对于在制造业中的航空航天产品零部件精度要求十分严苛&#xff0c;从前期的设计、中期建造、后期维修检测&#xff0c;任何一个环节、任何…

java CAS详解(深入源码剖析)

CAS是什么 CAS是compare and swap的缩写&#xff0c;即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作&#xff0c;而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住&#xff0c;等之前获得锁的线程释放锁之后&am…

Nginx配置负载均衡时访问地址无法生效

场景还原 今天有小伙伴练习Nginx配置负载均衡时总是无法使用配置好的网址访问 配置文件信详情 http {# 负载均衡 后端IP地址和端口 webservers 策略 轮询upstream webservers{server 192.168.1.100:8080 weight90; server 127.0.0.1:8080 weight10; }server{listen 80;ser…

C#使用OpenCv(OpenCVSharp)图像轮廓多边形逼近和轮廓最小矩形实例

本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像轮廓多边形逼近和轮廓最小矩形实例。 多边形逼近的目的是减少轮廓的点数,但看起来轮廓形状差不多。 最小矩形:面积更小的矩形,把轮廓包围起来实例 创建winform项目,添加控件和事件 添加类 using System; using…

学习路之PHP--laravel postman 提交表单出现419错误

问题图片 解决&#xff1a; 白名单 有时候你可能希望设置一组不需要 CSRF 保护的 URL 。例如&#xff0c;如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统&#xff0c;你会需要从 CSRF 的保护中排除 Stripe webhook 处理程序路由&#xff0c;因为 Stripe 不知道要发…