【主键索引】和【非主键索引】
索引简述
索引的目的在于提高查询效率,类比字典;实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引列也是要占用空间;
常见的MySQL主要有两种结构:Hash索引 和 B+ 树索引,我们使用的是InnoDB和MyISAM引擎,默认的都是B+树;
为什么用 B+ 树做索引而不用哈希表做索引?
1、哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。
2、如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表。
3、索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加。
【主键索引】和【非主键索引】的区别
主键索引和非主键索引是有区别的,主键索引存放的值是整行字段的数据,而非主键索引上存放的值不是整行字段的数据,而是存放主键字段的值。
其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引
如下图:ID是主键,K是非主键
- 如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
- 如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。
为什么建议使用【主键自增】的索引
但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,那么需要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,如果刚好 R4 所在的数据页已经满了,需要进行页分裂操作,这样会更加糟糕。
但是,如果我们的主键是自增的,每次插入的 ID 都会比前面的大,那么我们每次只需要在后面插入就行, 不需要移动位置、分裂等操作,这样可以提高性能。也就是为什么建议使用主键自增的索引;
【主键索引】和【非主键索引】相关推荐
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- mysql非主键索引_主键索引和非主键索引的区别
1. 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行模糊查 ...
- mysql非主键索引_主键索引和非主键索引解析
1. 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行模糊查 ...
- Mysql主键索引与非主键索引
Mysql主键索引与非主键索引 前言 InnoDB引擎 主键索引: 非主键索引 MySIAM引擎 主键索引 非主键索引 InnoDB和MyISAM的区别 前言 什么是B树: B树也叫B-树,是一棵多路 ...
- 数据库索引相关(主键索引和非主键索引区别)
索引基础 关于索引的知识可以看:SQL索引(INDEX). 简单概括就是:为数据库某些字段增加索引是可以加快查询速度的,并且一个表是可以创建多个索引的,而一个索引可以包含多个字段. 如果不使用索引,则 ...
- MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语
1 MyCat分片规则 数据切分中重要的几条原则,其中有几条数据冗余,表分组(Table Group). 1.1全局表 如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或数据量 ...
- 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...
- Mysql主键索引与非主键索引区别
什么是索引 MySql官方索引的定义:索引(Index)是帮助MySql高效获取数据的数据结构,索引的目的在于提高查询效率,类比字典:实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录 ...
- 【mysql】聚簇索引(聚集索引)和非聚簇索引(二级索引、辅助索引)的区别
文章目录 总结 1. 聚簇索引 一个坑 2. 非聚簇索引 3. 二级索引 总结 聚簇索引也叫聚集索引.,并不是一种单独的索引类型,而是一种数据存储方式.那么可以理解聚簇索引是一种抽象概念,在具体实现的 ...
- sql中添加唯一索引(非主键)
if OBJECT_ID('tempdb..#tem') is not null drop table #tem create table #tem (aa nvarchar(20)) alter t ...
最新文章
- 微服务,微架构[五]之springboot读取properties文件
- iOS中EXC_BAD_ACCESS解决办法
- Spring5参考指南:IOC容器
- LeetCode 654. 最大二叉树(递归)
- 求一批整数中出现最多的个位数字
- 批量ping IP并检测IP延迟率和丢包率脚本
- 从零开始搭二维激光SLAM --- 总结
- RK G68三模说明书
- linux eqep驱动框架,【活动结束】《基于28377的伺服驱动系统调试》第一期/共......
- 计算机用户配置如何查看,怎么查看电脑内存和配置 教你查看电脑真实配置的方法...
- if 条件结构与switch条件选择结构
- 微信点餐系统要服务器吗,微信点餐系统,钉钉点餐系统
- springboot2.x 集成百度 ui-dgenerator生成分布式唯一id
- 市场调研报告-全球与中国熔接器市场现状及未来发展趋势
- 空洞骑士复活歌女玛丽莎的方法(复活其他灵魂NPC同理)
- 浅谈开发与研发之差异
- java并发编程实战(二)
- SolidWorks 2010 SP0.0 三维机械设计
- 本科大数据专业该怎么上?
- oracle有什么发展方向,OracleDBA的前景