阅读文本大概需要3分钟。

MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes )。以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果表上定义有主键,那么该主键索引是聚集索引。如果表中没有定义主键,那么MySQL取第一个唯一索引( unique )而且只含非空列( NOT NULL )作为主键,InnoDB使用它作为聚集索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。

0x01:聚簇索引,说起索引,不能不说B+树

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

MySQL官方索引的定义:索引( Index )是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质;索引是数据结构。

数据库查询是数据库的最主要功能之一。谁都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找( linear search ),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。

当表有聚簇索引时,他的数据行实际上存放在索引的叶子页(leaf page)中。术语 “聚簇”表示数据行和相邻的键值紧凑地存储在一起(这并非总成立)。因为无法同时把数据行存放在两个不同的地方,索引一个表只能有一个聚簇索引。

图来源:https://blog.csdn.net/onupway/article/details/88805368

0x02:聚族索引的优点

  • 可以把相关数据保存在一起。例如实现电子邮件时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数的数据页就能获取某个用户的全部邮件。如果没有使用聚族索引,则每封邮件都可能导致一次磁盘I/O;

  • 数据访问更快。聚族索引将索引和数据保存在同一个B-Tree中,因此从聚族索引中获取数据通常比在非聚族索引中查找更快。

  • 使用覆盖索引扫描的查询可以直接使用节点中的主键值。

0x03:聚族索引的缺点

  • 聚簇数据最大限度的提高了I/O密集型应用的性能,但如果数据全部都放在内存中,则访问的顺序就没有那么重要了,聚簇索引也就没有那么优势了;

  • 插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。但如果不是按照主键顺序加载数据,那么在加载完成后最好使用OPTIMIZE TABLE命令重新组织一下表。

  • 更新聚簇索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。

  • 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临“页分裂”的问题。当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次分裂操作。页分裂会导致表占用更多的磁盘空间。

  • 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候。

  • 二级索引(非聚簇索引)可能比想象的要更大,因为在二级索引的叶子节点包含了引用行的主键列。

  • 二级索引访问需要两次索引查找,而不是一次。

有关二级索引需要两次索引查找的问题?

答案在于二级索引中保存的“行指针”的实质。要记住,二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值。这意味着通过二级索引查找行,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找到对应的行。这里做了重复的工作:两次B-Tree查找而不是一次。对于InnoDB,自适应哈希索引能够减少这样的重复工作。

中奖名单如下:Vancurphon与vil

参考:https://www.cnblogs.com/starhu/p/6406495.html

往期精彩

01 漫谈发版哪些事,好课程推荐

02 Linux的常用最危险的命令

03 精讲Spring Boot—入门+进阶+实例

04 优秀的Java程序员必须了解的GC哪些

05 互联网支付系统整体架构详解

关注我

每天进步一点点

喜欢!在看☟

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

  1. mysql deadlock 展示_MySQL DeadLock -- 二级索引导致的死锁

    MySQL Deadlock 复现步骤 建表SQL CREATE TABLE `t_wms_order_item` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ...

  2. mysql group by 查询慢_MySQL慢查询优化(线上案例调优)

    PS:本文已收录到1.1K+ Star的开源项目<面试指北>,如果想要了解更多大厂面试相关的内容,请关注Github项目:https://github.com/NotFound9/inte ...

  3. mysql 页和叶子页_Mysql —— 页与索引

    一.前言 之前了解过Mysql中索引的数据结构,但是看得非常浅显,仅仅知道索引底层实现的数据结构是 B+ tree,以及B+ tree 简单的增加节点和删除节点.但是对一些细节问题依然不太明白,在此借 ...

  4. mysql事务和非事物_mysql事务型与非事务型表1.8.5.3. 事务和原子操作

    1.8.5.3. 事务和原子操作 MySQL服务器(3.23至该系列的最高版本,所有4.0版本,以及更高版本)支持采用InnoDB和BDB事务存储引擎的事务.InnoDB提供了全面的ACID兼容性.请 ...

  5. mysql如何进行视图恢复_mysql事务 视图 索引 备份和恢复

    事务 1.事务: 概念:是作为单个逻辑工作单元执行的一系列操作 多个操作作为一个整体向系统提交,要么都执行,要么都不执行 事务是一个不可分割的工作逻辑单元 默认情况下 , 每条单独的SQL语句视为一个 ...

  6. 使用mysql创建外键约束_Mysql创建外键约束的两种方式

    通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题. 1.创建表时直接创建外键约束create table books( bookid number(10 ...

  7. MySQL外键没作用_MySQL 外键索引不生效

    mysql> set default_storage_engine="InnoDB"->; Query OK,0 rows affected (0.00 sec) my ...

  8. mysql数据没有同步更新_MySQL数据库主从没有同步的两种解决方案

    MySQL数据库主从没有同步的两种解决方案 发布时间:2020-05-13 13:54:57 来源:亿速云 阅读:190 作者:三月 栏目:数据库 下文主要给大家带来MySQL数据库主从没有同步的两种 ...

  9. mysql压力测试并优化_MySQL压力测试索引优化效果演示全过程

    1.模拟数据库数据 drop database if exists oldboy; create database oldboy charset utf8mb4 collate utf8mb4_bin ...

最新文章

  1. 奢侈品级别的广告位,到底要不要继续砸钱?
  2. Python的第一个程序 Hello world
  3. SPSS 26安装教程
  4. SpringCloud feign 的三种超时时间配置
  5. AcWing 126. 最大的和
  6. days to_days_Java2Days 2012:Java EE
  7. 【BZOJ2326】【codevs2314】数学作业,第100篇博文纪念
  8. c语言中栈的作用,栈(Stack)的概念和应用及C语言实现
  9. paip.提升用户体验---c++ 右键菜单以及socket接口
  10. 程序员最喜欢什么样的项目经理?
  11. java ipmi关闭服务器,Dell服务器的IPMI/iKVM使用方法(开机,关机,重启,重装系统)...
  12. 动易 dw css不对,动易模板常用CSS修改实际操作技巧
  13. Win7计算机内存不足,请保存文件并关闭这些程序
  14. 苏州企业申报2019年高新技术企业财务工作如何开展
  15. 7.动态绘制(Jig)
  16. 用户未登录跳转至登录页面
  17. python代码编写工具_编写更好的Python代码的终极指南
  18. 电子科技大学计算机与科学学院,电子科技大学计算机科学与工程学院(网络空间安全学院)、资源与环境学院赴我所调研考察...
  19. Python 二维离散傅里叶变换
  20. MySQL删除或清空表内数据的方法

热门文章

  1. ​三位中国科学家与诺贝尔物理奖的擦肩而过
  2. 上海市名校一年级数学考试附加题,难住学霸
  3. 宋志平:麻省理工创新体系带给我的3个思考
  4. 妙到巅峰的8个简洁数学证明(文科生都能看懂),隐隐触摸到一丝只属于神的智慧气息……...
  5. 湖南打工妹逆袭成为身价5亿“网络第一红娘”
  6. 数学江湖中的“独孤九剑”
  7. mysql count 优化索引_如何通过使用索引在InnoDB上优化COUNT(*)性能
  8. 查看mysql表的数据和结构
  9. html中怎么自动获得搜索文本框的光标焦点
  10. pip install scikit-image on windows 失败 解决方案