目录

聚簇索引

非聚簇索引

辅助索引

使用聚簇索引的优劣势

优势

劣势

InnoDB索引实现

InnoDB聚簇索引

InnoDB辅助索引

MyISAM索引实现

MyISAM非聚簇索引

​MyISAM辅助索引


两者都是使用B+树的数据结构,可以看一下这篇文章

聚簇索引

将数据和索引放在一起,并且是按照一定顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻的存放在磁盘上的

一般情况下主键就是默认的聚簇索引

用图来解释就是这样的

上图就是按照主键建立的聚簇索引,叶子结点存储着该主键所有的信息

因为B+树是指在叶子结点存放数据,聚簇索引就是直接将行的所有数据存储在叶子结点上

InnoDB引擎就使用聚簇索引

非聚簇索引

叶子结点不存储数据,存储的是行的地址,也就是说根据索引查找到的数据行的位置,得到数据行的位置以后再去磁盘中查找数据

类似于一本书,非聚簇索引获得是书的目录,我们需要根据获得的目录(比如第三章第一节)然后到对应的页码获得内容

上图就是非聚簇索引,不像聚簇索引中保存的是行的所有信息,非聚簇索引保存的是数据的地址,具体的数据还需要根据地址进行查找

MyISAM引擎就使用的非聚簇索引

辅助索引

与结点存放的是主键的值

上图就是按照名字建立的辅助索引,对应的名字中只存储主键值

使用聚簇索引的优劣势

优势

1.查询通过聚簇索引可以直接获得数据,相比非聚簇索引需要二次查询(非覆盖索引的情况下)效率要高

2.聚簇索引对于范围查询效率很高,因为数据是按照大小排列的(主键)(B+树的特性)

3.聚簇索引适合在排序的场所,非聚簇索引不适合

劣势

1.维护索引很昂贵,特别是插入新行或者主键被更新导致要分页的时候。按照主键的插入顺序是最快的方式

2.当表使用UUId为之间的时候,会使数据存储稀松,就会出现聚簇索引比全表扫描更慢,所以建议使用int的自增作为主键

3.如果逐渐比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值,过长的主键值,会导致非叶子结点占用更多的物理空间

所以对于InnoDB表,我们一般都会定义一个自增的、不可更新的较小值作为主键

InnoDB索引实现

InnoDB聚簇索引

InnoDB中一定有主键,主键一定是聚簇索引,如果不手动设置,则会使用unique索引(每个列具有唯一的值,别的列都不相同),没有unique索引,则MySQL会自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型

InnoDB辅助索引

        辅助索引是建立在聚簇索引之上的,聚簇索引是根据主键值创建,辅助索引可以根据InnoDB表中的任何数据创建

比如将名字作为辅助索引,则叶子结点存储的值为名字(key)+主键

MyISAM索引实现

MyISAM非聚簇索引

MyISAM采用B+树作为索引结构,与InnoDB不同的是叶结点存放的是数据记录的地址,而不是行所有的值,MyISAM的聚簇索引是不能重复的

MyISAM辅助索引

主索引和辅助索引在结构上没有区别,只是主索引要求key是唯一的,而辅助索引的key可以重复

参考文章

聚簇索引和非聚簇索引(通俗易懂 言简意赅)_坚持住啊-CSDN博客膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili聚簇索引和非聚簇索引(通俗易懂 言简意赅)_坚持住啊-CSDN博客

MySQL 中的Innodb 聚簇索引和Myisam 的非聚簇索引_时光钟摆-CSDN博客

【数据库】聚簇索引与非聚簇索引相关推荐

  1. Mysql聚簇索引和非聚簇索引原理(数据库)

    一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...

  2. Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别

    Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...

  3. 数据库聚簇索引和非聚簇索引,页分裂的介绍及会产生的问题(整理自网络)

    参考 http://www.mamicode.com/info-detail-549679.html https://blog.csdn.net/wen_3370/article/details/56 ...

  4. mysql聚簇索引存储结构_Mysql聚簇索引和非聚簇索引原理(数据库)

    本文链接:https://blog.csdn.net/lisuyibmd/article/details/53004848 一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他 ...

  5. 数据库中的聚簇索引和非聚簇索引

    聚簇索引和非聚簇索引的比较 聚簇索引和非聚簇索引最大的区别就在于数据和索引是否分开储存. 聚簇索引:将数据和索引一起储存,索引结构的叶子节点存的是数据行. 非聚簇索引:数据和索引分开储存,索引结构的叶 ...

  6. mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...

  7. 聚簇索引与非聚簇索引学习总结

    聚簇索引与非聚簇索引的区别 通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索引并不能实现对所有 数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查 ...

  8. 聚簇索引、非聚簇索引、普通索引、唯一索引

    一.聚簇索引 VS 非聚簇索引 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buf ...

  9. 浅析聚簇索引与非聚簇索引(也叫二级索引)

    通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内 ...

最新文章

  1. C# 汉字编码GB2312转换
  2. Kinect for Windows V2 SDK+ VS2012 环境搭建
  3. 【C++简明教程】Python和C++指定元素排序比较
  4. sqlalchemy数据库中的group_by()和order_by()使用
  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立
  6. Linux下Java开发环境的搭建Tomcat6+jdk6+eclipse3.5.2+Myeclipse9.0+mysql5.1.47
  7. SAPMMC控制台服务消失的解决方法
  8. 中职生计算机专业600分,来了!超全盘点高职分类中500-600分及以上的高中生能报的专业和院校名单!...
  9. Linux 基本操作--文件查看 (day3)
  10. 探究foreach对于迭代变量的封装性的研究
  11. python 反弹shell,加了UDP
  12. 使用matlab生成含正弦波表数据ROM
  13. idea前端可视化_jsp可视化开发工具_netbeans jsp可视化_idea 可视化开发 jsp
  14. TSP_旅行商问题 - 遗传算法(四)
  15. smtplib库:Python使用QQ邮箱发送邮件
  16. 什么是数据分析报告,主要有什么价值?
  17. 【English】十一、一般疑问句
  18. 四年嵌入式技术沉淀,处女作《STM32CubeMX系列实战教程》诞生
  19. 修改Docker默认的数据目录
  20. LeetCode 51-60题

热门文章

  1. Python中reversed()函数
  2. idea各种中文乱码问题
  3. Tensorflow实战(三)——验证码识别(二)
  4. Vue-Element写一个简单的列表管理23/100统
  5. 跑步节奏音乐匹配Android项目开发和调试经验
  6. 勒让德符号判断二次剩余-C语言
  7. 宁芝普拉姆键盘说明书
  8. 系统架构图编写(概要设计)
  9. 【物联网中间件平台-04】YFIOs驱动开发指南
  10. js可以打开mat文件吗_企业微信最大可以传多大文件?企业微信发送文件有限制吗?...