首页 > 数据库 >MySql聚集索引和非聚集索引的区别

MySql聚集索引和非聚集索引的区别

时间:2024-02-05 15:12:48浏览次数:47  
标签:name 聚集 查询 索引 MySql 数据 id

MySql中的聚集索引和非聚集索引主要体现在以下几个方面:

1.存储方式:

  聚集索引的叶子节点存储的是整行数据,非聚集索引叶子节点存储的是键值和整行的标识。

2.索引结构:

  聚集索引的索引结构于数据表的物理结构相同,非聚集索引的索引结构与数据表的物理结构不同。

      在数据库中,物理结构指的是数据在磁盘上的存储方式和组织形式。以下是一个关于聚集索引和非聚集索引物理结构的简单示例:

      聚集索引的物理结构:

   假设有一个学生表 students,其中包含列 id(学生编号)、name(学生姓名)和 age(学生年龄)。如果将 id 列设置为聚集索引,那么聚集索引的物理结构可能如下:

  • 按照 id 列的值进行排序。
  • 数据行按照 id 的顺序存储在磁盘上。
  • 聚集索引的 B+ 树结构中,叶子节点包含了完整的学生数据行,包括 idname 和 age 等列的值。

  例如,id 为 1 的学生数据行紧挨着 id 为 2 的学生数据行存储,依次类推。

  非聚集索引的物理结构:

  对于非聚集索引,假设在 name 列上创建了一个非聚集索引。那么非聚集索引的物理结构可能如下:

  • 非聚集索引的 B+ 树结构根据 name 列的值进行排序。
  • 叶子节点包含了 name 列的值以及对应的 id
  • 数据行本身仍然按照聚集索引(例如 id)的顺序存储在磁盘上。

  例如,非聚集索引的叶子节点可能按照姓名的字母顺序排序,但实际的数据行可能是按照 id 的顺序存储在磁盘上的。

  这种物理结构的不同导致了聚集索引和非聚集索引在查询性能和操作效率上的差异。聚集索引可以直接获取到完整的数据行,而非聚集索引需要通过索引值找到对应的 id,然后再通过 id 找到实际的数据行。

  请注意,这只是一个简单的示例,实际的数据库系统可能会采用更复杂的结构和算法来实现索引和数据的存储与管理。具体的物理结构和实现方式可能因数据库系统的不同而有所差异。在实际应用中,了解和优化索引的使用需要综合考虑查询需求、数据      分布、索引选择等多个因素。

3.查询效率:

  聚集索引查询时会直接定位到数据行,因此查询效率更高,而非聚集索引先需要通过键值找到行标识,再通过行标识找到对应数据行,因此查询效率相对较低。

  假设有一个学生表 students,其中包含列 id(学生编号)、name(学生姓名)和 age(学生年龄)。

  聚集索引查询:

  如果我们在 id 列上创建了聚集索引,那么查询时可以直接利用聚集索引定位到数据行。例如,要查询学生编号为 1001 的学生信息,可以使用如下查询:

SELECT * FROM students WHERE id = 1001;

  由于聚集索引按照 id 排序,数据库可以快速地定位到 id 为 1001 的行,直接返回对应的学生信息,查询效率较高。

  非聚集索引查询:

  如果我们在 name 列上创建了非聚集索引,那么查询时需要先通过键值找到行标识,再通过行标识找到对应的数据行。例如,要查询姓名为 "Alice" 的学生信息,可以使用如下查询:

SELECT * FROM students WHERE name = 'Alice';

  在执行这个查询时,数据库首先通过非聚集索引找到姓名为 "Alice" 的行标识(可能是 id 的值),然后再根据行标识去找到对应的学生数据行。这个过程比直接使用聚集索引多了一个中间步骤,因此查询效率相对较低。

4.更新效率:

  聚集索引在更新时会涉及到整行数据的更新,因此更新效率相对较低,而非聚集索引在更新时只需要更新对应的键值和行标识,因此更新效率相对较高。

5.适用场景:

  聚集索引适用于需要频繁查询整行数据的场景,例如主键索引、唯一索引等,而非聚集索引适用于需要频繁查询特定列数据的场景,例如普通索引、外键索引等。

结尾:

  综上所述,聚集索引和非聚集索引的区别主要在于存储方式、索引结构、查询效率、更新效率和适用场景等方面。在实际应用中,应该根据具体的业务需求选择合适的索引类型,以提高数据查询和更新的效率。

标签:name,聚集,查询,索引,MySql,数据,id
From: https://www.cnblogs.com/shenweif/p/18008207

相关文章

  • 踩坑了,MySQL数据库生成大量奇怪的大文件
    作者:田逸(formyz)一大早就收到某个数据库服务器磁盘满的报警信息,其中数据盘使用率超过90%,如下图所示。这是一台刚上线不久的MySQL从库服务器,数据盘的总容量是300G。先登录系统,查看主从同步是否正常,幸运的是主从同步正常;再看看磁盘空间的使用情况,执行的命令及输出如下。df-h[root@MyS......
  • SQL数据库入门03:数据库表的完整性约束、索引与视图的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表完整性约束、索引与视图的创建、编辑与删除等操作的方法。(数据库基础(三):完整性约束、索引、视图)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用......
  • mysql模糊查询如何能用到索引?
    mysql模糊查询%我就不多说了。想要%不在左边也能用到索引,可以选择加全文索引假设我的表是wa_log记录日志的,url是访问的路径,想要查询url路径中包含admin的数据ALTERTABLEwa_logADDFULLTEXT(url);EXPLAINSELECT*FROMwa_logWHEREMATCH(url)AGAINST('admin'INBOOLEAN......
  • mysql如何实现左连接、右连接
    学生表 students学生ID学生姓名1张三2李四3王五4小六5小七成绩表 grades学生ID课程学生成绩1数学862语文793数学914英语881、查询所有学生的id、姓名、成绩用左连接可以实现:SELECTstudents.学生ID,students.学生姓名,grades.成绩FROMstudentsLEFTJOINgradesONstudents.......
  • mysql-自定义函数
    0、结构delimiter$$--修改语句结束符,mysql默认的结束符是分号,为了在函数体中避免遇到分号就结束,重新定义结束符createfunction函数名(形参)returns返回值类型begin//函数体return返回值数据;end$$delimiter;--将语句结束符修改回来1、变......
  • centos系统安装mysql并开放端口外部使用
    查看安装包:https://dev.mysql.com/downloads/repo/yum/下载MySQL源:wgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm安装MySql源yum-yinstallmysql57-community-release-el7-11.noarch.rpm查看一下安装效果yumrepolistenabled|grepmysq......
  • 文章索引
    立志用功如种树然,方其根芽,犹未有干;及其有干,尚未有枝;枝而后叶,叶而后花。------王守仁算法1.二进制求幂2.最长子序列总结3.差分约束4.拓扑排序5.欧拉回路6.KMP和Manacher算法题解LuoguP1024[NOIP2001提高组]一元三次方程求解P1091合唱队形P3370【模板】......
  • mysql问题记录
    Mac下brew安装mysqlsudomysql.serverstart报错StartingMySQL.Loggingto'/usr/local/var/mysql/192.168.0.102.err'...ERROR!TheserverquitwithoutupdatingPIDfile(/usr/local/var/mysql/192.168.0.102.pid).解决办法sudochown-Rmysql/usr/local/var......
  • 非空处理 Java非空判断 非空处理及mysql数据库字段的not null
    1.mysql##去掉非空,如果非空又没有默认值,这样程序在添加数据的时候i,如果没有设置值就会报错。该操作很危险。##ALTERTABLE`order_test`ADDCOLUMN`test_card_name`NOTNULLVARCHAR(200)COMMENT'卡名称';##修改允许为空..ALTERTABLE`order_test`MODIFYCOLUMN`test......
  • 聚簇索引、回表与覆盖索引
    聚簇索引一般指的是主键索引(如果存在主键索引的话)。作为一个正常开发,建表时主键肯定是必须的。而即使如果表中没有定义主键,InnoDB会隐式选择一个唯一的非空索引代替。所以我们就直接含糊点说:聚簇索引就是主键索引!其余的都是非聚簇索引。那到底什么是聚簇索引,什么是非聚簇索......