目录

  • 索引
    • 1.1 概念
    • 1.2 作用
    • 1.3 使用场景
    • 1.4 使用
    • 1.5 索引最常用的数据结构

索引

1.1 概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,
并指定索引的类型,各类索引有各自的数据结构实现。

1.2 作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。


1.3 使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引

总之,索引作用总结成一句话就是:提高查找速度,减慢了增,删,改操作的速度,也占用的额外的磁盘空间

1.4 使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
show index from 表名;

案例:查看学生表已有的索引

show index from student;

  • 创建索引
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引 :
create index 索引名 on 表名(字段名);

案例:创建成绩中,score字段的索引

create index score_index on score(score);

  • 删除索引
drop index 索引名 on 表名;

案例:删除成绩表中score字段的索引

drop index score_index on score;


1.5 索引最常用的数据结构

索引保存的数据结构主要为B+树,及hash的方式。

在介绍B+数之前,我们先来简单了解一下B树:

B树以及B+树是一颗N叉树

如图所示就是一颗B树:

B树的每个节点上,都会存储N个key值
N个key值就划分出了N+1个区间,每个区间都对应到一个子树(子树区间key值不包含双亲树的key值)
虽然B树相较于二叉树来说高度是小了,但是每个节点就多了
而在数据库中,相比于比较次数来说,IO次数才是更关键的!!
而数据库中的索引就是以节点为单位进行磁盘IO的,所以这里B树的节点比较多,就不是太适合来做数据库的索引存储的数据结构!

而是以B+树来做数据库的索引数据结构:


B+树也是一颗N叉搜索树,每个节点上都包含多个key值,每个节点如果有N个key值,就分成了N个区间

父节点的值,都会在子节点中体现,非叶子节点中的每个值,最终都会在叶子节点中体现出来,父节点中的值,会作为子节点中的最大值(最小值),以上这个画的是最大值的情况。
最下面的叶子节点,就使用链表进行按顺序连接 !

所以,可以看出:
B+树就是为数据库索引量身打造的,因为:

  1. 使用B+树进行查找的时候,整体的磁盘IO次数是比较小的
  2. 所有的查询最终都会落到叶子节点上,每次查询的IO次数都是差不多的,查询速度比较稳定
  3. 叶子节点用链表进行连接之后,非常适合进行范围查找。例如:要找到>=5<=11的值,只需要对叶子节点的链表进行遍历即可。
  4. 所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此,非叶子节点整体占用的空间较小,就可以缓存到内存中!!一旦非叶子节点能够全放到内存里,这时候磁盘IO几乎就没了
  • 内容重点总结

(1)对于插入、删除数据频率高的表,不适用索引
(2)对于某列修改频率高的,该列不适用索引
(3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引

  • over

【MySQL】MySQL的索引相关推荐

  1. php普通索引和唯一索引,mysql下普通索引和唯一索引的效率对比

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致 ...

  2. mysql 性能优化索引、缓存、分表、分布式实现方式。

    系统针对5000台终端测试结果 索引 目标:优化查询速度3秒以内 需要优化.尽量避免使用select * 来查询对象.使用到哪些属性值就查询出哪些使用即可 首页页面: 设备-组织查询 优化 避免使用s ...

  3. mysql添加临时索引_mysql创建索引/删除索引操作

    -- 1.ALTER 创建索引 -- table_name表名,column_list列名,index_name索引名 -- 创建index索引 ALTER TABLE table_name ADD ...

  4. mysql教程联合索引_MySQL中的联合索引学习教程

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...

  5. MySQL 如何创建索引?怎么优化?

    2019独角兽企业重金招聘Python工程师标准>>> 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽 ...

  6. PHP面试MySQL数据库的索引

    你好,是我琉忆,PHP程序员面试笔试系列图书的作者. 本周(2019.3.4至3.8)的一三五更新的文章如下: 周一:PHP面试MySQL数据库的基础知识 周三:PHP面试MySQL数据库的索引 周五 ...

  7. MySQL数据库之索引的应用

    前面几篇文章详细介绍了MySQL数据库的DML,DDL,DCL,DQL常用操作,本篇文章将介绍MySQL中一块对于开发和维护都比较重要的内容--MySQL索引的应用! 1.索引的作用 (1)如果索引为 ...

  8. mysql 删除重复索引_如何检查mysql的重复索引

    展开全部 在一个生产库上,没有创建索引,是不可思议的,当然你的索引创e68a84e8a2ad62616964757a686964616f31333363373765建的太多了.冗余了,更是不可思议的. ...

  9. mysql实习生笔试题_2014阿里实习生面试题MySQL如何实现索引的

    [相关专题推荐:mysql面试题(2020)] 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: My ...

  10. mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引

    通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...

最新文章

  1. Window 2003证书服务器迁移到Windows 2008 R2
  2. 想知道黑苹果什么味道?来咬一口尝尝~
  3. python opencv旋转_Python opencv实现与rotatedrect类似的矩形旋转,pythonopencv,RotatedRect
  4. oracle指令df,​ oracle 常用命令大汇总
  5. Tomcat为Cookie设置HttpOnly属性
  6. python数字类型及运算_Python数据类型之数字(Numbers)和运算符
  7. AWR Report and session_cached_cursor
  8. Maven打包SpringBoot项目时分离依赖JAR,配置文件时POM文件的参考配置
  9. ArcGIS Pro 3.0最新消息
  10. STM8单片机STVD环境新建工程笔记
  11. [白话解析] Flink的Watermark机制
  12. 走出NASA,向大地“下战书”,他要用卫星遥感数据改变中国农业
  13. Branches ‘develop‘ and ‘origin/develop‘ have diverged. Fatal: And branch ‘develop‘ may be fast-forwa
  14. java视、频_[java视频]感人故 事视 频网 站上那找~~~
  15. Java生鲜电商平台-商品中心的架构设计与源码解析
  16. 算法习题集 - Miscellaneous
  17. 联想ThinkPad安装windows7系统详细图文教程
  18. OSPF的区域间防环详解
  19. 微信多开工具,微信防撤回、QQ防撤回、Tim防撤回工具,微信消息防撤回、QQ消息防撤回、Tim消息防撤回,无视撤回功能,不错过每一条消息
  20. C4D惊喜插件合集,让你瞬间提升工作效率

热门文章

  1. 化栈为队(两个栈来实现一个队列)
  2. Linux之cp和mv命令选项
  3. 网络工程师_想要记录下来的一些题_1
  4. 小时候的小霸王游戏!坦克大战 超级玛丽 魂斗罗 忍者神龟 都有!
  5. 94. 二叉树的中序遍历(迭代)
  6. DotNetCore跨平台~dotnet pack打包详细介绍
  7. 我的Android进阶之旅------解决错误: java.util.regex.PatternSyntaxException: Incorrect Unicode property...
  8. org.openqa.selenium.StaleElementReferenceException
  9. 第3章 View的事件体系
  10. ie下input的type属性为hidden问题