数据库是如何通过索引定位数据,索引的原理讲解
前言
我们之前讲了MySQL索引的底层数据结构,以及索引的失效原理等知识点。那么索引在硬盘上到底是怎么存储的呢?怎么通过索引定位查询出一条真实的数据呢?
MySQL两大引擎MyIsam
和InnoDB
他们的索引又有哪些不同点呢?
今天我们就来给大家揭晓一下
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 *
,为什么尽量使用覆盖索引
,大家能根据他们的索引结构推测出来吗,给大家留道思考题?
每个技术都是存在优缺点的,我们还是那句话,对于技术我们要扬长避短,根据我们的业务场景,发挥出技术的长处。
数据库是如何通过索引定位数据,索引的原理讲解相关推荐
- oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...
========================================= 1.查看表空间使用情况 ========================================= with ...
- mysql explain详解_数据库mysql(1)——B+TREE索引原理
一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...
- sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)
一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...
- mysql 数据索引使用_mysql数据库正确建立索引及使用
普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...
- 数据库建立索引、数据表创建规则、备用字段 / 保留字段 / 预留字段
数据库建立索引 数据库.数据表建立索引的原则 数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在w ...
- 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)
1.应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的 ...
- 数据库查数据 索引
怎么从数据库中的一亿条数据中读取我想要的十条数据? 写查询的sql语句,要在查询关键字上建立索引,这样可以加快速度. 例如:select 字段1,字段2,- from 表 where 条件1= aa ...
- solr 从数据库导入数据,全量索引和增量索引(实例配置原理)
http://blog.csdn.net/u013378306/article/details/50761610 为防止原文删除特此备份 ------------------------------- ...
- solr 从数据库导入数据,全量索引和增量索引
首先说一下是从MySQL数据库导入数据 这里使用的是mysql测试. 1.先在mysql中建一个表:solr_test 2.插入几条测试数据: 3.用记事本打solrconfig.xml文件,在sol ...
最新文章
- ICCV 2021 | 用于细粒度 3D 形状分割的基于持久同源的图卷积网络
- 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
- java原生的编译软件_Java 转原生平台代码 RoboVM
- 中day参数介绍_浅谈生物制药中的 CHO 细胞培养工艺开发
- bookkeeper源码解析
- Windows7中安装内存与可用内存不一致的解决办法
- HTML5七夕情人节表白网页制作【自定义文字-烟花告白】HTML+CSS+JavaScript浪漫烟花表白网页制作
- linux服务网卡速率查看,linux 下查看网卡工作速率
- 读取本地文件assets内容
- apache php 无法读取网络邻居共享文件的处理,提权
- TIA Openness开发入门(1)
- java中的异或交换位置_java异或实现两个变量交换
- Jquery插件ajaxFileUpload文件上传与Bootstrap之fileinput插件上传文件的使用与MultipartFile使用与导入Excel和导出Excel
- 泰然金融牵手快公益 花儿计划国学课入畲乡
- OpenGL学习笔记:颜色
- vscode必备常用插件
- 淘宝 直通车 _h python源码
- Android实现将View转化为图片并保存到本地
- webjar的详细使用方式
- python中变量无须先创建和赋值而直接使用_python综合练习1