推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?

MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的前提

什么是聚簇索引?

很简单记住一句话:找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。

什么是非聚簇索引?

索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。

clustered index(MySQL官方对聚簇索引的解释)

The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated.注意标黑的那段话,聚簇索引就是主键的一种术语

一个例子

下面我们创建了一个学生表,做三种查询,来说明什么情况下是聚簇索引,什么情况下不是。

create table student (    id bigint,    no varchar(20) ,    name varchar(20) ,    address varchar(20) ,    PRIMARY KEY (`branch_id`) USING BTREE,    UNIQUE KEY `idx_no` (`no`) USING BTREE)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

第一种,直接根据主键查询获取所有字段数据,此时主键是聚簇索引,因为主键对应的索引叶子节点存储了id=1的所有字段的值。

select * from student where id = 1

第二种,根据编号查询编号和名称,编号本身是一个唯一索引,但查询的列包含了学生编号和学生名称,当命中编号索引时,该索引的节点的数据存储的是主键ID,需要根据主键ID重新查询一次,所以这种查询下no不是聚簇索引

select no,name from student where no = 'test'

第三种,我们根据编号查询编号(有人会问知道编号了还要查询?要,你可能需要验证该编号在数据库中是否存在),这种查询命中编号索引时,直接返回编号,因为所需要的数据就是该索引,不需要回表查询,这种场景下no是聚簇索引

select no from student where no = 'test'

总结

主键一定是聚簇索引,MySQL的InnoDB中一定有主键,即便研发人员不手动设置,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来当作主键索引,其它普通索引需要区分SQL场景,当SQL查询的列就是索引本身时,我们称这种场景下该普通索引也可以叫做聚簇索引,MyisAM引擎没有聚簇索引。

在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...相关推荐

  1. mysql insert 主键冲突_在MySql中建立存储过程和解决insert into select 中主键冲突的有关问题...

    首先说需求,我想重复插入大量数据,那么首先想到的,就是用insert into select语句. 但是因为mysql中没有将主键设为自增长,导致每次都会报主键冲突的错误,插入失败. 对于这个问题,就 ...

  2. 如何在mysql 中建立有关联关系的表

    昨天在自己做的一个系统中使用mysql,折腾了半天始终无法建立外键,通过查找文档最终将问题解决,原来mysql中默认建立的表所使用的存储引擎为MyISAM类型,在这种类型的table中建立的外键只起到 ...

  3. navicat for mysql创建触发器_在navicat for mysql中建立触发器

    Mysql的触发器(trigger):监视某种操作,并触发另一种操作.简要说:对表M的操作A触发了对表N的操作B. 触发器创建语法四要素: 1..引发对象(哪一张表引发的?也就是说表M是谁?) 2.触 ...

  4. deepin中mysql数据库的连接_教你如何典雅的用Python连接MySQL数据库

    简介:作者 | Python语音识别不管是机器学习.web开发或者爬虫,数据库都是绕不过去的.那么今天我们就来介绍Python如何Mysql数据库进行连接以及数据的交换.主要分为以下几个方面:什么是数 ...

  5. mysql中的视图_分布式 | DBLE 是如何实现视图的?

    作者:苏仕祥 浩鲸科技 PaaS 组件团队成员,长期从事分库分表中间件的相关解决方案工作,热爱技术,乐于分享. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并 ...

  6. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?

    问题阐述 自MySQL 5.0 开始,MySQL 就支持存储过程.存储过程是一些被用户定义的SQL 语句集合.一个存储程序是可以被存储在服务器中的一套SQL 语句.存储过程可以被程序.触发器或另一个存 ...

  7. mysql中递增列_如何使用JDBC在MySQL中创建带有自动递增列的表?

    在创建表时,在某些情况下,我们需要自动生成/增加列的值(例如ID).各种数据库以不同的方式支持此功能. 在MySQL数据库中,您可以使用以下语法声明列自动递增.CREATE TABLE table_n ...

  8. mysql 中修改对象_在MySQL中,创建一个数据库后,还可以对象其进行修改,不过这里的修改是指可以修改被创建数据库的相关参数,也可以修改数据库名。...

    [多选题]注射时,在(  )情况下,采用较高的注射速率. [单选题]通常,所设置的模具温度是指和制品接触的模腔内表面在(   ). [单选题]反映某一事件发生强度的指标应选用 [判断题]当试样制备之后 ...

  9. 如何在mysql中添加用户_如何给mysql数据库添加一个用户

    首先以root身份登录到MySQL服务器中. $ mysql -u root -p 当验证提示出现的时候,输入MySQL的root帐号的密码. 创建一个MySQL用户 使用如下命令创建一个用户名和密码 ...

最新文章

  1. onethink封装arclist调用文章列表!
  2. Visual Studio 15.4发布,新增多平台支持
  3. C++:=default一些说明
  4. Android开发之关于transformDexArchiveWithExternalLibsDexMergerForDebug java.lang.OutOfMemoryError问题的参考解决方案
  5. 【渝粤教育】电大中专中医基础知识 (2)作业 题库
  6. android webview es6,Android v 5.0 webview HTML5,CSS3和ES6兼容性
  7. oracle新建对象 权限管理
  8. java 字符串比较 == equals_java怎么比较字符串,==和equals有什么区别
  9. java一维打地鼠_Java编程实现打地鼠文字游戏实例代码
  10. Android自定义控件学习(六)-------使视图互动
  11. FCKeditor 上传图片和浏览服务器时提示请先登陆的解决办法
  12. 快速删除node_modules文件夹!!!
  13. 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
  14. 卸载Notepad++
  15. mysql alter before_MySQL之alter语句用法总结
  16. LaTeX符号大全-基于lshort-zh-cn
  17. OSX更新后JRE6被删除引发了问题
  18. VBS中实现99乘法表的输出
  19. MAC的物理地址与IP地址查询方法
  20. EDTA 最简易安装方法

热门文章

  1. php给留言分配id_简单实现PHP留言板功能
  2. 网络资产管理系统_固定资产管理系统的常用操作
  3. matlab解带参数的积分方程组,方程组求解问题:方程组中有带参数的积分函数,求参数...
  4. python删除文件夹中的jpg_Python简单删除目录下文件以及文件夹的方法
  5. 【Modern OpenGL】前言
  6. asterisk1.8 Makefile分析 (1)
  7. mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...
  8. java 永久代_Java新生代、老生代和永久代详解
  9. 【转】ABP源码分析十:Unit Of Work
  10. 【转】什么是 Azure 资源管理器