热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL的索引及其结构

MySQL的索引索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据&

MySQL的索引

索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息。

在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

InnoDB支持的索引:主键索引(PRIMARY),普通索引(INDEX),唯一索引(UNIQUE),组合索引,总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。


主键索引(PRIMARY)

数据列不允许重复,不允许为NULL,一个表只能有一个主键。


唯一索引(UNIQUE)

数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。

确保每一行数据的一致性。

可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引

可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索


普通索引(INDEX)

可以通过 ALTER TABLE table_name ADD INDEX index_name (column); 创建普通索引

可以通过 ALTER TABLE table_name ADD INDEX index_name(column1, column2,

column3); 创建组合索引


全文索引(FULLTEXT)

可以通过 ALTER TABLE table_name ADD FULLTEXT (column); 创建全文索引

索引并非是越多越好,创建索引也需要耗费资源,一是增加了数据库的存储空间,二是在插入和删除时要花费较多的时间维护索引


覆盖索引

覆盖索引简单来说就是只查询索引就能获取到数据不必再回表查询,即要查询的列已经被索引列覆盖。避免了回表的产生减少了树的搜索次数,从而提升性能。

那回表是什么:在流程中从非主键索引树搜索回到主键索引树搜索的过程

借鉴https://juejin.cn/post/6844903967365791752


索引结构

https://www.cnblogs.com/rickiyang/p/13559507.html

如上文所述,InnoDB 引擎是面向行存储的,数据都是存储在磁盘的数据页中,数据页里面按照固定的行格式存储着每一行数据。InnoDB存储引擎是 B+ 树索引组织的,所以数据即索引,索引即数据。B+ 树的叶子节点存储的都是数据段的数据。==InnoDB 引擎对数据的存储必须依赖于主键,主键对应的索引叫做聚集索引。==如果建表没有建主键,InnoDB 会从表字段中寻找第一个非空的唯一索引作为聚集索引,如果还是找不到,InnoDB 会生成一个不可见的名为 ROW_ID 的列,该列是一个 6 字节的自增数字,用来创建聚集索引。

MyISAM 也是使用 B+ 树作为索引存储结构,他的叶子节点 data 域存放的是数据的物理地址,即索引结构和真正的数据结构其实是分开存储的。

InnoDB 中采用主键索引的方式,所有的数据都保存在主键索索引中。


image-20220403105503207

主键索引存储了整行数据,而非主键索引中存储的值为主键id

执行sql语句:

SELECT age FROM student WHERE name = '小李';

流程为:


  1. 在name索引树上找到名称为小李的节点 id为03
  2. 从id索引树上找到id为03的节点 获取所有数据
  3. 从数据中获取字段命为age的值返回 12

什么情况索引失效

条件查询、隐式查询

1.如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于复合索引,如果不使用前列,后续列也将无法使用,类电话簿。
3.like查询是以%开头
4.存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.where 子句里对索引列上有数学运算,用不上索引
6.where 子句里对有索引列使用函数,用不上索引
7.如果mysql估计使用全表扫描要比使用索引快,则不使用索引(比如数据量极少的表)


like索引失效


  • %放在右边,前缀,代表查询以"a"开头的数据,如:abc
  • 两个%%,中缀,代表查询数据中包含"a"的数据,如:cab、cba、abc
  • %放在左边,后缀,代表查询以"a"为结尾的数据,如cba

一、%号放右边(前缀)

由于B+树的索引顺序,是按照首字母的大小进行排序,前缀匹配又是匹配首字母。所以可以在B+树上进行有序的查找,查找首字母符合要求的数据。所以有些时候可以用到索引。

二、%号放左边

是匹配字符串尾部的数据,我们上面说了排序规则,尾部的字母是没有顺序的,所以不能按照索引顺序查询,就用不到索引。

三、两个%%号

这个是查询任意位置的字母满足条件即可,只有首字母是进行索引排序的,其他位置的字母都是相对无序的,所以查找任意位置的字母是用不上索引的。


推荐阅读
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
author-avatar
咿呀最有味先
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有