聚簇索引和主键索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,具体细节依赖于其实现方式。

MySQL数据库中innodb存储引擎,B+树索引可以分为:

聚簇索引(也称聚集索引,clustered index)

辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。

这两种索引内部都是B+树,聚集索引的叶子节点存放着一整行的数据。

InnoDB聚簇索引和主键索引

Innobd中的主键索引是一种聚簇索引,

非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。

InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分;

一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。

我们日常工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,现在找到主键索引再通过主键索引找数据。

Innodb通过主键聚集数据,如果没有定义主键,innodb会选择【非空】的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

聚簇索引的优缺点

优点:

1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快

2.聚簇索引对于主键的排序查找和范围查找速度非常快

缺点:

1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键

2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般【定义主键为不可更新】。

3.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

辅助索引(非聚簇索引)

在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。

辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。

Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。

辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。

mysql主键和聚簇索引_MYSQL:聚簇索引和主键索引相关推荐

  1. mysql主键和聚簇索引_MySQL 聚簇索引一定是主键吗

    数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种. use myTest; drop table if exists t1; CREATE TABLE `t1` ( `i ...

  2. mysql 聚合索引和聚簇索引_MySQL 聚簇索引 和覆盖索引

    一.聚簇索引 1.聚簇索引并不是一种单独所以,而是一种数据储存方式. InnoDB 的聚簇索引实际上在同一结构中保存了B-Tree 索引和数据行. 2.当表有聚簇索引时,它的数据行实际上存放在索引的叶 ...

  3. mysql 聚簇索引和非聚簇索引_MySql聚簇索引与非聚簇索引的区别

    通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索 引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中, ...

  4. mysql 主键约束起名_MySQL名称的主键约束

    数据定义语句: CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar( ...

  5. mysql复合主键的区别_MySQL 的联合主键与复合主键区别

    MySQL 的联合主键与复合主键区别 复合主键就是指你表的主键含有一个以上的字段组成 . 例如; create table test ( name varchar(19), id number, va ...

  6. mysql外键约束分数_MySQL提高(外键约束)

    外键约束 1.条件语句的写法 在sql中可以通过'where 条件语句' 来对操作对象进行筛选 -筛选 a.比较运算符:=,<>,,<=,>= 注意:判断一个字段的值是否为空不 ...

  7. rds mysql 表被删了_MySQL · 捉虫动态 · 删除索引导致表无法打开

    问题背景 最近线上遇到一个问题,用户重启实例后发现有张表打不开了,经调研后发现是用户之前的霸蛮操作导致的,下面给出复现步骤: create table t1 (id int not null prim ...

  8. mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

    阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...

  9. mysql中主键的用法_MySQL中的主键以及设置其自增的用法教程

    1.声明主键的方法:您可以在创建表的时候就为表加上主键,如: CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name)); 也可以 ...

  10. mysql实现自增字符串_Mysql实现字符串主键自增示例教程-Go语言中文社区

    /* Mysql数据库练习 需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求 1 pid 为自增主键 2 插入数据的时候值添加姓名和年龄 3 性别 ...

最新文章

  1. 归并排序(代码注释超详细)
  2. 2020人工神经网络第一次作业
  3. spring boot:java.lang.IllegalStateException异常
  4. php web教程视频教程下载,Web全栈 PHP+React系列视频教程下载
  5. Linux下编译运行Go程序
  6. pycharm pyqt5实现登陆界面_PyQt5可以实现界面和逻辑代码分离吗?大声说出你的答案!...
  7. 我的域控是不是被攻击了?吓!
  8. 混合云存储:大数据应用的上云之道
  9. MySQL Replication主主复制—(实例)
  10. java基础 作业(一)
  11. 医疗信息化 医学信息 医院管理 资料下载
  12. 360强力删除也无法删除的文件 的 终极删除方法
  13. 如何关闭Win10易升更新?
  14. Lesson 6英语句子的种类(简单并列复合句)
  15. 《VoIP技术构架(第2版·修订版)》一 第2章 企业电话的今天
  16. jQuery控制在ready之后执行方法
  17. 【深度学习】04-01-自注意力机制(Self-attention)-李宏毅老师2122深度学习课程笔记
  18. 如何做一个一键吸空投箱的效果
  19. 百度经纬度和google经纬度转换测试
  20. BTC 复制节点(节点复制)复制区块数据,实现快速同步区块数据

热门文章

  1. cloudera manager安装使用
  2. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)
  3. spring 从源码学设计1-doDispatch()
  4. 路由模块router实现step1
  5. Xen虚拟机加入Puppet环境如何解决时间同步问题
  6. 博客堂服务器转移成功!
  7. c# 中的除法运算需要注意
  8. php从入门到精通分享,PHP从入门到精通学习路线图分享
  9. PHP Fatal error: Declaration of Hyperf\Framework\SymfonyEventDispatcher::dispatch($event) must be c
  10. mysql 标记_mysql-徽章/标记内容自用户上次看到以来已...