【MySQL】索引基础介绍

news2024/11/26 4:25:17

一、常见的存储引擎有哪些?区别是什么?

  • Mysql 默认的存储引擎是:InnoDB,具有支持事务、行级锁、高并发访问性能。
  • MyIsAM:访问速度快,实际运用如果是以读和插入操作为主,并对事物完整性和并发性要求不高,推荐选择,因为 MyISAM 最小的锁粒度是表锁,一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。(在 MySQL 5.5之前,当您创建表而未明确指定存储引擎时,MyISAM 是默认存储引擎,这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一)
  • Memory:不支持事务安全,支持表锁,不支持外键,所有数据储存在内存中,访问速度快。常用来做缓存。
  • InnoDB:Innodb 是 MySQL 5.5 之后默认的存储引擎,支持事务安全,锁机制是行锁,支持外键,一般运用在对数据完整性较高的核心数据。(选择最多)

二、索引结构

  • 二叉树:弊端当数据顺序插入时,纵深过长就导致性能降低
  • 红黑树:是自平衡的二叉树,本质也是一个二叉树,也有大数据层级深,导致检索速度慢
  • B-Tree:多路平衡查找树(几个指针就是几阶,每个指针指向一个key),每一个子节点都会放数据
  • B+Tree:(最大度数为4,4阶B+Tree),所有的元素都会出现在叶子结点,且所有的数据都会储存在叶子结点,叶子结点组成了一个双向链表。
  • Hash:Hash索引只能用于对等比较,不支持范围查询,无序,查询效率高,高于B+Tree索引。通常只需要一次检索就可以了,除遇到hash碰撞,(槽位后面的链表)。

InnoDB 为什么选择 B+Tree 

 三、索引分类

  • 主键索引

        索引列中的值必须是唯一的,不允许有空值。

  • 唯一索引

        索引列中的值必须是唯一的,但是允许为空值。

  • 全文索引

        只能在文本类型 CHAR,VARCHAR,TEXT 类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行 like 模糊查询时效率比较低,这时可以创建全文索引。

三、什么是聚簇索引和非聚簇索引

  • 聚簇索引:将数据存储的顺序与索引顺序相同,找到索引也就找到了数据
  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,本质上非聚簇索引存储的是聚簇索引的值,比如主键ID

​ 每个InnoDB表具有一个特殊的索引称为聚簇索引(也叫聚集索引,聚类索引,簇集索引),聚集索引选取规则:

  • 如果表上定义有主键,该主键索引就是聚簇索引。
  • 如果未定义主键,MySQL 取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB 使用它作为聚簇索引。如果没有这样的列,InnoDB就自己产生一个这样的ROWID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。

表中的聚簇索引(clustered index )就是一级索引,除此之外,表上的其他非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。

聚簇索引( 主键索引)和非聚簇索引(非主键索引)有什么区别?

聚集索引就是主键,主键id下面挂的是这一行的数据,而二级索引下面挂的是这一数据的id值

当执行select * from user where name=‘ARM’这条sql语句时

通过name查询,数据库会先到二级索引中去查到询该name所在的id,再根据id到聚集索引中去查到name=‘ARM’这一条具体数据。这一过程被称为 回表查询。

归根到底是因为,普通索引无法直接定位行记录。

所以,并不是创建完索引就完事的,在写 sql 语句的时候,尽量避免回表。

四、索引建立原则有哪些?

创建索引的命名规范:idx_user_name,idx 是 index 的简写,后面跟表名 user 跟字段名 name

创建唯一索引需要加unique,命名规范:uniq_idx_user_name,

创建索引之前要做SQL性能分析,查看服务器的状态信息、查看数据库的 增删改查的访问频率: SHOW GLOBAL STATUS LIKE 'Com_______'; ,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次等。

五、哪些情况下索引会失效?

  • 索引使用最左前缀法则 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列如果跳跃某一列,索引将部分失效(后面的字段索引失效)。 (如果跳过最左边的列后面的索引就会失效)
  • 范围查询,联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效,如何规避:使用>=或<=
  • 字符串不加引号,字符串类型的字段使用时不加引号,索 引将会失效
  • 模糊查询,如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效("%工")
  • or连接的条件用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。只有两侧都有索引的时候所有索引才不会失效

六、explain 查看 sql 语句 type 说明

表示连接类型,性能由好到差的连接类型为(system > const > eq_ref > ref > range > index > all ),其中 system、const 只是理想类型,基本达不到。我们自己实际能优化到 ref、range 这两个类型,ref 级别基本达不到。要对 type 优化的前提是,需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是 all。

  • NULL(对正常的业务系统来说,不可能优化为 null),一般情况下不会为 NULL,只有在没有查询任何表的时候才会返回 NULL;
explain select 'Hello World'
  • system(表中仅有一行(相当于系统表),这是 const 联结类型的一个特例)
  • const(表示通过索引一次就找到,const 用于比较 primary key 或者 unique 索引。因为只匹配一行数据,所以如果主键置于 where 列表中, mysql 能将该查询转换为一个常量。)
  • eq_ref(唯一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配。常见于唯一索引或者主键扫描。)
  • ref(非唯一性的索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体)
  • range(使用索引返回一个范围中的行,比如使用 between、<、>等的查询。这种范围扫描索引扫描比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描。)
  • index(用了索引,但是扫描了全部的索引)
  • all(查询全部数据,扫描全表,这一般比较糟糕,尽量避免)

注意:一般保证查询至少达到 range 级别,最好能达到 ref 级别。

六、平常遇到的一些总结

1、一个值只有0和1的情况,需不需要创建索引

不需要

2、经常删除操作的sql,对索引有没有影响

会有影响,insert 开销会比较大。delete 开销稍微小一点,但是删除大批量的数据会有很大影响。update 操作除非修改的是索引字段的值,不然对索引没有影响。

七、参考文档

  • 聚簇索引与非聚簇索引概念
  • Mysql 索引总结
  • 索引的缺点(3):降低增删改的性能

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

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

相关文章

面向对象程序设计期末项目总结

面向对象程序设计期末项目总结 开发前准备 MysqlNavicatTomCatIDEA 一&#xff0c;配置项目环境 右键项目名&#xff0c;添加新模块 命名后右键新建的模块 选中Web模块 到此项目创建完毕&#xff0c;接下来是配置环境。 打开IDEA–>File找到Project Structure 添加所…

Pikachu(皮卡丘)靶场中SQL注入

Pikachu靶场中SQL注入1.Pikachu(皮卡丘)靶场中SQL注入1.1.数字型注入1.2.字符型注入1.3.搜索型注入1.4.xx型注入1.5.insert/update注入1.6.delete注入1.7.http头注入1.8.盲注(base on boolian)1.9.盲注(base on time)1.10.宽字节注入1.Pikachu(皮卡丘)靶场中SQL注入 若遇到不链…

基于java+springboot+mybatis+vue+mysql的冬奥会科普平台

项目介绍 基于SpringBoot框架的冬奥会科普平台利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点&#xff0c;系统采用java语言开发&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。比如计算检索速度特别快、可靠性特别高…

大数据如何在制造业中进行应用?数据宝董事长汤寒林现身数字化年会讲了这个事

12月8日1670923102263472480日&#xff0c;2022中国数字化年会成功在线上举办&#xff01;本届年会以“向变而生”为主题&#xff0c;历时三天&#xff0c;特别打造了主论坛、高峰论坛与行业数智化论坛三大板块&#xff0c;60余位专家学者与来自各领域各行业数字化领军人物 通过…

前端基础(五)_CSS文本文字属性

CSS文本文字属性 1、文字属性 1.1、字号 font-size&#xff1a;38px; 浏览器默认16px; 1.2、字体 font-family: 如果字体名称包含空格&#xff0c;字体名称上加引号&#xff1b; 中文字体名称加引号&#xff1b; 多个字体名称作为一个回退系统来保存&#xff0c;如果第一个不…

什么才是写博客初心如何坚持

为何写机器人课程博客并一直坚持&#xff1f;&#xff08;2021&#xff09; 创新源自真心&#xff0c;“乱”创新的课程徒有其表&#xff0c;“不”创新的课程逐渐凋零。 个人觉得&#xff0c;课程教学创新宏观上的目标是让学生更好的认识自己并适应社会发展和变化&#xff1b…

停车场管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 主要用jsp,数据库用MySQL 分为前台用户和后台管理员 前台用户 主界面是一个区域内的两到三个停车场&#xff0c;然后 可…

virtualenv系列 (2) · 系统环境与虚拟环境

文章目录1. 怎样算是一套Python环境&#xff1f;2. 系统环境 VS 虚拟环境3. 虚拟环境最佳实践1. 怎样算是一套Python环境&#xff1f; 首先&#xff0c;我们得先弄清楚&#xff1a;怎样算是一个Python环境&#xff1f;然后再去区分系统环境和虚拟环境。简单地说&#xff0c;在…

[附源码]Python计算机毕业设计SSM基于web的家教管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

阿里5位高级架构师耗时两年共同研发《Redis入门手册》

在我们日常的开发中&#xff0c;无不都是使用数据库来进行数据的存储&#xff0c;由于一般的系统任务中通常不会存在高并发的情况&#xff0c;所以这样看起来并没有什么问题&#xff0c;可是一旦涉及大数据量的需求&#xff0c;比如一些商品抢购的情景&#xff0c;或者是主页访…

喜报!Coremail两大方案入选“2022年软件行业典型应用案例”

12月5日&#xff0c;由中国软件行业协会联合中软国际有限公司、江苏省软件行业协会主办的2022中国程序员节在江苏南京圆满落幕&#xff0c;本次活动聚焦当前我国对数字技术创新及应用发展的现实需求&#xff0c;以开源创新、软件根技术、平台工具等热点议题&#xff0c;探讨影响…

Spring Boot 配置文件 · properties 基本语法 · yml 基本语法 · yml 配置不同数据以及 null · yml 配置文件读取

一、配置文件作用二、配置文件的格式三、properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 缺点分析四、yml 配置文件说明4.1 yml 基本语法4.2 yml 与 properties 格式对比4.3 yml 配置不同数据类型以及 null4.4 yml 配置读取4.4.1 读取配置文件…

Win11十二月系统更新了什么内容?

微软今天发布了12月最新的累积更新补丁&#xff0c;根据Microsoft 支持页面&#xff0c;build 22621.963 现在会在用户 OneDrive 上的存储空间不足时在“设置”应用程序中警告用户&#xff0c;将 Windows Spotlight 与主题设置相结合&#xff0c;修复任务管理器应用程序的界面问…

SSM垃圾分类网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1,系统&#xff1a;Vindows10 2.软件&#xff1a;IDEA.SQLyog 3.数据库环境&#xff1a;ySQL 4.开源框架&#xff1a;sp…

毕业设计-基于SpringBoot幼儿园管理系统

环境&#xff1a;开发工具&#xff1a;idea&#xff0c;数据库&#xff1a;MySQL5.7 jdk1.8 架构&#xff1a;SpringBoot&#xff0c;前端HTML 主要功能 管理员&#xff1a; 用户管理&#xff08;编辑用户、删除用户、添加用户、查询指定用户&#xff09; 角色管理&#xff08;…

软件测试进阶——测试划分

文章目录按照测试对象划分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装和卸载测试安全测试性能测试按照是否查看代码黑盒测试白盒测试灰盒测试按照开发阶段划分单元测试集成测试系统测试回归测试冒烟测试验收测试按照实施组织划分α测试β测试按照是否运行划…

数据可视化常用工具推荐

数据可视化是将数据分析的结果以图形、表格等形式展示出来&#xff0c;这样能我们更加清晰、明了的理解分析结果、判断数据走势等&#xff0c;让没有进行过数据分析的人也能清楚的了解数据中所含有的规律、趋势等。下面小编将向大家介绍几种常用的数据可视化工具&#xff0c;分…

计算机毕业设计php+vue基于微信小程序的高校新生报到管理小程序

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,高校新生报到管理小程序就是信息时代变革中的产物之一。 任何程序都要…

外汇天眼:爆雷跑路!DingHui索要高额佣金,结果客户一分钱没拿到!

我们都知道&#xff0c;外汇交易佣金是外汇平台杠杆进入中国市场时的产物&#xff0c;也可以将其简单的理解为是在自己原本的手续费之外&#xff0c;额外增加的一些交易成本。 不过随着外汇市场的发展&#xff0c;在外汇交易平台进行交易也是越来越正规化&#xff0c;现如今正…

16-luogu-P1012-[NOIP1998 提高组] 拼数

文章目录[NOIP1998 提高组] 拼数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示大神代码分析总结[NOIP1998 提高组] 拼数 题目描述 设有 nnn 个正整数 a1…ana_1 \dots a_na1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻…