前言

我们之前讲了MySQL索引的底层数据结构,以及索引的失效原理等知识点。那么索引在硬盘上到底是怎么存储的呢?怎么通过索引定位查询出一条真实的数据呢?

MySQL两大引擎MyIsamInnoDB他们的索引又有哪些不同点呢?

今天我们就来给大家揭晓一下

MyIsam 和 InnoDB常见区别

事务方面

InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。

外键方面

InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败。

索引层面

InnoDB 是聚集(聚簇)索引,MyISAM 是非聚集(非聚簇)索引。后面会重点讲解这两种索引的区别。

MyISAM支持 FULLTEXT类型的全文索引, InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好。

锁粒度方面

InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。

一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。

这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。

硬盘存储结构

MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

  • .frm文件存储表的定义

  • 数据文件的扩 展名为.MYD (MYData)。

  • 索引文件的扩 展名是.MYI (MYIndex)。

Innodb存储引擎存储数据库数据,一共有两个文件(没有专门保存数据的文件):

  • Frm文件:表的定义文件。

  • Ibd文件:数据和索引存储文件。数据以主键进行聚集存储,把真正的数据保存在叶子节点中。

聚簇索引 和 非聚簇索引

聚簇索引(InnoDB)

数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。

InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,像复合索引、前缀索引、唯一索引等等。

  • 聚簇索引默认是主键

  • 如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。

  • 如果没有这样的索引,InnoDB 会在内部生成一个名为 GEN_CLUST_INDEX 的隐式的聚簇索引。

非聚簇索引(MyISAM)

数据索引分开存储,表数据存储顺序与索引顺序无关。

MyISAM索引查询数据过程

非聚簇索引存储结构:

源于网络

MyISAM的 B+树 的叶子节点上,记录的是真实数据的存储地址

比如通过主键id查询,MyISAM查询流程如下:

  • 根据id值在B+树上找到相应的叶子节点

  • 取出叶子节点上的数据存储地址

  • 根据数据存储地址,去找到相应的真实数据

InnoDB索引查询数据过程

聚簇索引存储结构:

源于网络

InnoDB的 B+树 的叶子节点上,记录的是真实行数据

比如通过主键id查询,InnoDB查询流程如下:

聚簇索引(主键索引):

  • 根据id值在B+树上找到相应的叶子节点

  • 取出叶子节点上的行数据,返回即可

辅助索引(聚簇索引以外的):

  • 在相应索引的B+树上找到相应的叶子节点

  • 取出叶子节点上的数据,该数据是主键id

  • 拿到主键id后,去主键索引的B+树上找到相应的叶子节点

  • 取出叶子节点上的行数据,返回

总结

以上就是两个引擎索引查询流程,MyIsam 和 InnoDB各有优缺点。

比如通过主键id查询的时候,InnoDB比MyIsam快一些,因为InnoDB只需要一次B+树查找就能取出数据。MyIsam通过B+树查找到地址后,还需要根据地址去查询真正的数据。

但是InnoDB普通索引查询会比MyIsam慢些,因为InnoDB要进行2次B+树的查找。

还比如说在数据重构的时候,MyIsam记录的是数据地址,那么重构数据的时候地址就要重新生成一遍,这也是有问题的。

InnoDB重构数据的时候就不会这样,因为他记录的是主键id,地址会变化,主键id是不会变的。

还有为什么少用select *,为什么尽量使用覆盖索引,大家能根据他们的索引结构推测出来吗,给大家留道思考题?

每个技术都是存在优缺点的,我们还是那句话,对于技术我们要扬长避短,根据我们的业务场景,发挥出技术的长处。

数据库是如何通过索引定位数据,索引的原理讲解相关推荐

  1. oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...

    ========================================= 1.查看表空间使用情况 ========================================= with ...

  2. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

  3. sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

  4. mysql 数据索引使用_mysql数据库正确建立索引及使用

    普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...

  5. 数据库建立索引、数据表创建规则、备用字段 / 保留字段 / 预留字段

    数据库建立索引 数据库.数据表建立索引的原则 数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在w ...

  6. 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)

    1.应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的 ...

  7. 数据库查数据 索引

    怎么从数据库中的一亿条数据中读取我想要的十条数据? 写查询的sql语句,要在查询关键字上建立索引,这样可以加快速度. 例如:select 字段1,字段2,- from 表 where 条件1= aa ...

  8. solr 从数据库导入数据,全量索引和增量索引(实例配置原理)

    http://blog.csdn.net/u013378306/article/details/50761610 为防止原文删除特此备份 ------------------------------- ...

  9. solr 从数据库导入数据,全量索引和增量索引

    首先说一下是从MySQL数据库导入数据 这里使用的是mysql测试. 1.先在mysql中建一个表:solr_test 2.插入几条测试数据: 3.用记事本打solrconfig.xml文件,在sol ...

最新文章

  1. ICCV 2021 | 用于细粒度 3D 形状分割的基于持久同源的图卷积网络
  2. 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
  3. java原生的编译软件_Java 转原生平台代码 RoboVM
  4. 中day参数介绍_浅谈生物制药中的 CHO 细胞培养工艺开发
  5. bookkeeper源码解析
  6. Windows7中安装内存与可用内存不一致的解决办法
  7. HTML5七夕情人节表白网页制作【自定义文字-烟花告白】HTML+CSS+JavaScript浪漫烟花表白网页制作
  8. linux服务网卡速率查看,linux 下查看网卡工作速率
  9. 读取本地文件assets内容
  10. apache php 无法读取网络邻居共享文件的处理,提权
  11. TIA Openness开发入门(1)
  12. java中的异或交换位置_java异或实现两个变量交换
  13. Jquery插件ajaxFileUpload文件上传与Bootstrap之fileinput插件上传文件的使用与MultipartFile使用与导入Excel和导出Excel
  14. 泰然金融牵手快公益 花儿计划国学课入畲乡
  15. OpenGL学习笔记:颜色
  16. vscode必备常用插件
  17. 淘宝 直通车 _h python源码
  18. Android实现将View转化为图片并保存到本地
  19. webjar的详细使用方式
  20. python中变量无须先创建和赋值而直接使用_python综合练习1

热门文章

  1. 英读廊——为什么夏天白天打瞌睡晚上却睡不着?
  2. 阿里云MAVEN/华为MAVEN/腾讯云MAVEN 仓库地址
  3. 阅读 《图解密码技术 第三版》的归纳和总结
  4. 数据预处理-python实现
  5. Instant-Meshes-标架场方法
  6. 协方差、协方差矩阵定义与计算
  7. STM32开发入门及实战
  8. 在ISE下分析约束时序
  9. 稀疏一元多项式(C++)
  10. NASA关于编程的十条原则