精华内容
下载资源
问答
  • 聚集索引是将每个字段建立同样结构的索引,并且都去一个固定的文件查找数据 非聚集索引是以主键的B+树存储数据,其他字段根据索引查找到主键再去主键树查找数据。 (1)非聚集索引 查询 1.先查询没有建立索引,...

    一.为什么使用索引?

    如果没有索引,查询数据的时候只能一行行扫描,效率很差。
    mysql分为聚集索引和非聚集索引,简单来讲:
    聚集索引是将每个字段建立同样结构的索引,并且都去一个固定的文件查找数据
    非聚集索引是以主键的B+树存储数据,其他字段根据索引查找到主键再去主键树查找数据。

    (1)非聚集索引

    查询
    1.先查询有没有建立索引,如果有建立索引的话:
    2.就会到MYISAM文件中定位到地址
    3.然后去MYD文件中根据地址获取数据
    注:比如以id建立的索引和以name建立的索引,B+tree上存储的都是MYD文件中对应的地址,如果是同一条数据的话,这个地址是一致的。
    在这里插入图片描述

    (2)聚集索引

    InnoDB存储引擎下的索引:
    如图存储的是主键-数据的形式在这里插入图片描述
    使用 的是B+ tree结构,
    1.建立主键索引:如果没有主键的话,会选择不重复的列建立索引,如果没有不重复列,默认生成主键来建立索引。
    2.通过主键查询:直接通过主键的B+树查询数据。
    3.通过其他查询字段的索引查询:叶子节点存储的是主键,先查询主键,再去主键的树查询数据。
    在这里插入图片描述

    展开全文
  • mysql 聚集索引,非聚集索引,覆盖索引区别。... 这就是为什么一个表只能有一个主键, 一个表只能有一个聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。 ...

    mysql 聚集索引,非聚集索引,覆盖索引区别。

    聚集索引:

    给表上了主键,那么表在内存上的由整齐排列的结构转变成了树状结构,也就是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

    非聚集索引:

    非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。

    区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。

    覆盖索引:

    如果一个索引包含所有需要查询的字段的值,我们就称之为“覆盖索引”。因此不需要通过主键ID值的查找数据行的真实所在, 直接取得叶节点中name的值返回即可。

    个人理解:

    非聚集索引就是一般常用的索引,索引树的根节点是表的主键。

    聚集索引就是主键组成的树,根节点是数据库真实数据的位置。

    另外知识点:

    许多数据库的文档会告诉读者:聚集索引按照顺序物理的存储数据到磁盘。但是试想下,如果聚集索引必须按照特定顺序存放物理记录,则维护成本显得非常高。所以,聚集索引的磁盘存储并不是物理上连续的,而是逻辑上连续。

    展开全文
  • 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储: Id=0;username=username0;sex=男;address=浙江; Id=1;username=username1;sex=女;...
  • 1. 为什么索引通常使用B+Tree数据结构,而不是用其他数据结构。 (1) 不使用二叉排序树的原因 二叉排序树整体结构受结点插入顺序的影响,最坏情况下,索引按递增或递减的顺序插入,会使整个二叉排序树成为一个单链表...

    1. 为什么索引通常使用B+Tree数据结构,而不是用其他数据结构。

    在这里插入图片描述
    (1) 不使用二叉排序树的原因

    二叉排序树整体结构受结点插入顺序的影响,最坏情况下,索引按递增或递减的顺序插入,会使整个二叉排序树成为一个单链表,查找过程成为与每个记录的索引进行对比,时间复杂度会变为O(n)。

    (2) 不使用红黑树的原因
    可以避免使用二叉排序树树的结构有可能是单链表问题,但使用红黑树树的深度仍然过深。红黑树每个结点只能放一个记录索引,导致记录数量非常大时,红黑树的深度过深。

    在这里插入图片描述
    (3) 不使用B-Tree的原因
    可以解决红黑树树的深度过深问题,但B-Tree存在范围查找问题。对于范围查找中的每个记录的查找,都需要从根结点开始,需要耗费过多的资源。

    (4) 部分存储引擎既支持hash索引也支持B+Tree索引,但当数据量过大时且频繁使用范围查找时,为什么仍然建议使用B+Tree索引?
    理由见MySQL–基础知识点–14–索引 7.4什么是哈希索引

    (5) 通常建议使用B+Tree的原因
    B+Tree树中叶子结点存放记录(聚集索引)或记录所在物理地址(非聚集索引),叶子结点之间有指针连接便于范围查找,不需要消耗过多的资源。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    2. MyISAM

    使用的是B+Tree索引且是非聚集索引

    举例说明MyISAM存储引擎的查找过程如下

    以Col1字段作为索引,查找Col1=49的记录
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (1) 判断Col1是否是索引字段。如果是则跳到(3);如果不是则跳到(2)。
    (2) 逐行判断是否是所要查询的记录。
    (3) 从一直加载在内存中的根中去查找。找到指针(i)。
    (4) 根据指针(i)从磁盘加载相应的结点(ii)到内存。
    (5) 从结点(ii)中找到指针(iii)。
    (6) 根据指针(iii)从磁盘加载相应的结点(iv)到内存。
    (7) 从结点(iv)中找到Col1=49对应的记录的物理地址。
    (8) 将Col1=49对应的记录的物理地址的内容读出即为查询结果。

    3. Innodb

    使用的是B+Tree索引且是聚集索引

    举例说明Innodb存储引擎的查找过程如下

    以Col1字段作为索引,查找Col1=49的记录
    在这里插入图片描述
    (1) 判断Col1是否是索引字段。如果是则跳到(3);如果不是则跳到(2)。
    (2) 逐行判断是否是所要查询的记录。
    (3) 从一直加载在内存中的根中去查找。找到指针(i)。
    (4) 根据指针(i)从磁盘加载相应的结点(ii)到内存。
    (5) 从结点(ii)中找到指针(iii)。
    (6) 根据指针(iii)从磁盘加载相应的叶子结点(iv)到内存。
    (7) 在叶子结点(iv)中找到Col1=49,并直接读出相应的记录即可。

    3.1 聚集索引/非聚集索引

    聚集索引:

    • 逻辑上:B+Tree叶子结点包含了完整的数据记录,
    • 物理上:聚集索引包括两个文件.frm(表结构的描述文件)、.idb(表中存储的数据记录和索引文件)
    • 例如:Innodb存储引擎
      在这里插入图片描述
      在这里插入图片描述

    非聚集索引:

    • 逻辑上:B+Tree叶子结点包含的只是记录所在的磁盘地址。
    • 物理上:非聚集索引包含三个文件.frm(表结构的描述文件)、.MYD(表中存储的数据记录文件)、.MYI(表中存储的索引文件)
    • 例如:MyISAM存储引擎
      在这里插入图片描述
      在这里插入图片描述

    3.2 为什么Innodb必须有主键?并且推荐使用整型的自增主键?

    3.2.1 为什么Innodb必须有主键,而MyISAM的主键可有可无?

    Innodb:

    • 使用的是聚集索引,索引和数据记录是组织在一起的,放在同一个后缀为.idb的文件中。

    MyISAM:

    • 使用的是非聚集索引,索引和数据记录是分开存放的,索引放在后缀为.MYD文件中,数据记录放在.MYI文件中。

    3.2.2 为什么推荐使用整型?

    从两个角度考虑。
    (1) 比较次数:

    • 使用整形每次只比较1次,比较次数少;使用字符串,每次都需对字符串中的字符从左到右依次比较,比较次数多。
      (2) 空间占用:
    • 使用整型占用空间比使用字符串占用空间少,使用整型用到的磁盘会更少。

    3.2.3 B+Tree中叶子结点之间指针的作用是什么?

    在这里插入图片描述
    作用:为了更加快速的进行范围查找。

    hash索引对于等值查询(即Col1=49)速度很快,直接计算出hash(49)从哈希表中查找相应记录的物理地址,读出记录即可。但对于范围查询由于hash索引没有B+Tree索引中叶子结点之间的指针,因此查询所耗费的资源很大。

    同样,B-Tree索引同样没有类似于B+Tree中叶子节点之间的指针,导致对于范围查询中的每一个查询都需要从根结点开始,导致资源消耗很大。

    因此表常使用的是B+Tree索引

    3.2.4 为什么推荐使用自增?

    在这里插入图片描述
    原因:

    • 每个叶子结点内部主键索引从左到右是递增趋势。
    • 叶子结点之间主键索引从左到右也是递增趋势。

    总之,总体来看整棵B+Tree树的主键索引从左到右是递增趋势。若不使用自增,后序插入的某个值可能插入前边已经排好序的某个叶子结点中,有可能造成叶子节点分裂以及其祖辈结点的分裂,造成资源的浪费。若使用自增,后序插入的值会依次在前边已经排好序的最后一个叶子结点中插入最后,或在最后一个叶子节点后又新建一个叶子结点插入所要插入的元素即可,避免了资源的浪费。因此推荐使用自增。

    3.2.5 为什么非主键索引结构叶子节点存储的是主键值?

    优点:

    • 保持数据的一致性,若非主键索引结构叶子节点也存储数据,对于同一条记录来说可能会导致主键索引与多个非主键索引中的叶子结点的数据不一致,或者为了保持数据的一致性需要更多的资源开销。
    • 节省存储空间。避免了数据的冗余,对于同一条记录只保存一份数据。

    缺点:

    • 需要进行回表操作,对于使用非主键索引查找一条记录,整个查找过程分两步进行:
      • (1) 在非主键索引结构中找到所查记录的主键值。
      • (2) 根据拿到的记录主键值在主键索引结构中找到相应的记录,读出即可。

    3.2.6 联合索引的底层原理

    在这里插入图片描述
    与单个索引

    结构:

    • 联合索引与单个索引结构类似,使用的都是B+Tree。

    存储:

    • 只不过存储时单个索引存储的是一个索引,联合索引存储的是多个索引。

    查询比较过程:

    • 单个索引对于每个索引只需比较一次。
    • 联合索引可能需要对其中所用到的字段依次进行比较,来找到相应的结果。

    4. 索引优化

    pass



    [学习视频]
    https://www.bilibili.com/video/BV1aE41117sk?p=1

    展开全文
  • 这就是为什么一个表只能有一个主键, 一个表只能有一个聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。  非聚集索引聚集索引一样, 同样是采用平衡树作为索引的数据...

      如果给表定义了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是「平衡树」结构,换句话说,就是整个表就变成了一个索引,这就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

      非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。 

      非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

      但是也可以根据查询的结果建立复合索引或者多字段索引查询,为一个索引指定多个字段, 那么这个多个字段的内容都会被同步至索引之中,能加快查询的速度。另外,复合索引的属性顺序也会影响到查询的速度,具体较为优化的顺序要根据具体数据分布。

      参考链接:

      https://www.cnblogs.com/lykbk/p/wererereredfdf.html

      https://zhuanlan.zhihu.com/p/23624390?utm_source=wechat_session&utm_medium=social

    转载于:https://www.cnblogs.com/LinsenLi/p/9596488.html

    展开全文
  • mysql索引为什么使用B+tree ? 二叉树:对于特殊的自增索引树比较高,造成时间复杂度增加。...主键索引:主键是一种唯一性索引,但必须指定为PRIMARY KEY,每个表只能有一个主键 唯一索引索引列的值只能出现一..
  • 主键索引:一张表只能有一个主键索引,不允许重复、不允许 NULL; 唯一索引:数据列不允许重复,允许 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一...
  • 索引那些事儿

    2020-09-04 16:24:45
    为什么要给表加上主键?...这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引,因为主键的作用就是把表的数据格式转换成索引(平衡树)的格式放置。 select * from table where id = 1234;
  • 主键索引:一张表只能有一个主键索引,不允许重复、不允许 NULL; 唯一索引:数据列不允许重复,允许 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一...
  • MySQL索引有哪些,及如何创建索引? 1.了解索引 ...主要分为聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)两种,聚集索引指的是一列或多列的物理顺序和逻辑顺序是一致的,一个数据库表只能有
  • 09 索引

    2009-12-16 10:37:00
    sp_helpindex tablename 2、主键是聚集唯一索引 (×) 主键默认情况下是聚集唯一索引,在建主键时可以给它指定非聚集索引nonclustered 聚集索引与唯一unique索引没什么关系 3、一个表中只能有一个聚集索引clustered...
  • 数据库索引

    2020-08-03 10:59:27
    什么是索引? 索引就跟我们的字典目录一样,如果一本字典没有目录,那么你要找一个字,那就相当费劲,得从头一点一点的找;...我们平时使用的主键索引就是聚集索引,一张表最多只能有一个聚集索引;而平
  • mysql 索引

    2019-02-19 15:34:33
    DB索引 为什么要给数据库加上主键 ... 这就是为什么一个表只能有一个主键, 一个表只能有一个聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置 索...
  • 索引

    2020-12-06 23:01:38
    目录:索引数据结构MyISAMInnoDB索引实现聚集索引为什么InnoDB表必须主键,并且推荐使用整型的自增主键?(面试) 索引数据结构 二叉树,容易退化成链表 红黑树,数据量很大的时候,高度太高不适合 Hash表,映射...
  • Mysql索引

    2020-07-12 16:19:21
    mysql数据库的Innodb引擎所有的表都默认建立在索引之上的,也就是聚集索引,而主键就是聚集索引,所以主键只能一个。普通索引也就是非聚集索引,可以多个。 索引的数据结构是B+树也就是平衡树。查找数据的时候根据...
  • 09年到了,这也是09年的第一篇...1,什么是聚集索引,为什么一个表中只能有一个聚集索引?(也叫簇索引) 聚集索引是一种特殊的索引,它重组了表中的数据,使数据按照索引的排序顺序存放在表中,这一点类似于字典...
  • 小议索引

    2007-05-17 20:20:55
    索引分为聚集索引和非聚集索引,建聚集索引时要看这个表是否已经有聚集索引了,因为一个表只能有一个聚集索引: create unique clustered index first on product(id) 非聚集索引: create ...
  • 索引的一些思考

    2014-03-08 13:01:44
    一、索引是什么? 答:索引是一种数据结构,它...由于聚集索引会影响到数据的物理排序,所以每个表只能有一个聚集索引,但可以有多个非聚集索引。 例子解释: 1、create table t_student( code varchar(20), ...
  • Mysql索引知识点(简单介绍,常见问题mysql中有哪些索引主键索引和唯一索引什么区别 mysql中有哪些索引 ...一个表里只能有一个主键索引,唯一索引可以有多个(例如:可以有多个外键作为索引) ...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐.2.一个加了主键的表,并不能被称之为「表」。... 这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引」,因为主键...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。... 这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引」,因为主...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐.2.一个加了主键的表,并不能被称之为「表」。... 这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引」,因为主键...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐.2.一个加了主键的表,并不能被称之为「表」。... 这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引」,因为主键...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐.2.一个加了主键的表,并不能被称之为「表」。... 这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引」,因为主键...
  • 什么是索引? SQL Server中的数据也是按页(一页是4kb)存放。 索引:是SQL Sever 编排数据的内部方法。...聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个。 非聚集索引
  • 数据库索引 加索引后查询会变快,但是写入,删除,修改会变慢,增加了数据库的存储空间 类似于书的目录。...因此一个表只能有一个聚集索引为什么索引会给查询以外的操作带来影响? 平衡树必须始终维持...
  • 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表... 这就是为什么一个表只能有一个主键,一个表只能有一个「聚...
  • 物理索引缺点 建立索引效率低,只能一个。  更说服力的:(转)  为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

为什么只能有一个聚集索引