精华内容
下载资源
问答
  • 索引 - 索引键的最大大小

    千次阅读 2019-05-17 15:13:29
    在设计包含许多键列或大型列的索引时, 计算索引键的大小以确保不超过最大索引键的大小. SQL Server 为所有索引键列的最大总大小保留 900 字节. 这排除了在非聚集索引的定义包括的非键列. 计算索引键的大小 若要...

    在设计包含许多键列或大型列的索引时, 计算索引键的大小以确保不超过最大索引键的大小. SQL Server 为所有索引键列的最大总大小保留 900 字节. 这排除了在非聚集索引的定义中包括的非键列.

    计算索引键的大小

    若要计算索引键的大小, 请按下列步骤执行操作。

    1. 显示索引将依据的表列的属性, 可以使用 sys.columns 目录视图执行此操作.
    2. 求索引键中将定义的每一列的长度之和.
      例如, 以下语句聚合 Person.Address 表中指定列的 sys.columns 视图索引的 max_length 列.
    USE AdventureWorks2008R2;
    GO
    
    SELECT SUM(max_length) AS TotalIndexKeySize
    FROM sys.columns
    WHERE name IN(N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode')
    AND object_id = OBJECT_ID(N'Person.Address');
    

    如果表列为 Unicode 数据类型(例如, ncharnvarchar), 则所显示的列长度是该列的存储长度. 这是 CREATE TABLE语句中指定的字符数的两倍. 在前面的示例中, City 定义为 nvarchar(30) 数据类型. 因此, 该列的存储长度为60.

    1. 如果总长度小于 900 字节, 则该列可以作为索引键列. 如果总长度超过 900 字节, 则查看有关选项的以下信息和其他注意事项.

    CREATE INDEX 语句使用下列算法来计算索引键大小 :

    • 如果所有固定键列的大小加上 CREATE INDEX 语句中指定的所有可变键列的最大大小小于 900 字节, 则 CREATE INDEX语句将成功完成, 而不出现警告或错误.
    • 如果所有固定键列的大小加上所有可变键列的最大大小超过 900 字节, 而所有固定键列的大小加上所有可变键列的最小大小小于 900 字节,则 CREATE INDEX 语句将成功执行, 并显示一条警告, 指示如果后续 INSERTUPDATE语句指定的值所生成的键值大于 900 字节, 则该语句可能会失败. 若表中现有数据行的值所生成的键值大于 900 字节, CREATE INDEX 语句将失败. 若后续 INSERTUPDATE 语句指定的数据值所生成的键值大于 900 字节,该语句将失败.
    • 如果所有固定键列的大小加上 CREATE INDEX 语句中指定的所有可变列的最小大小超过 900 字节, CREATE INDEX语句将失败.

    下表总结了创建达到或超过最大索引键大小限制的索引的结果.

    可变长度列的最小大小 + 固定数据列的大小可变长度列的最大大小 + 固定数据列的大小现有行的索引键列长度总和的最大值*是否创建索引消息类型由于索引键值过大导致 INSERT 或 UPDATE 运行时错误
    > 900 字节不相关不相关错误索引没有生成错误。
    <= 900 字节<= 900 字节不相关否。
    <= 900 字节> 900 字节<= 900 字节警告仅当所有索引列的当前长度之和大于 900 字节时。
    <= 900 字节> 900 字节> 900 字节错误索引没有生成错误。

    在执行 CREATE INDEX 语句时, 表中的任何行都不能有总长度超过 900 字节的索引键值.

    使用包含列以避免大小限制

    可以将非键列包含在非聚集索引中来避免 16 键列的最大当前索引大小限制和 900 字节的最大索引键大小. SQL Server 数据库引擎在计算索引键列数或索引键列的总大小时不考虑非键列. 在具有包含列的非聚集索引中, 索引键列的总大小限制在 900 字节. 所有非键列的总大小只受 INCLUDE 子句中所指定列的大小限制. 例如, varchar(max) 列限制为 2 GB. INCLUDE 子句中的列可以为除 text, ntextimage 以外的所有数据类型.

    注意: 在对表进行分区时, 如果分区键列尚未出现在非唯一聚集索引中, 则它们将会由数据库引擎添加到索引中. 索引列合并后的大小(不将包含列计算在内)加上任何添加的分区列在非唯一聚集索引中不能超过 1800 字节.

    展开全文
  • 索引键的最大大小

    千次阅读 2009-05-11 11:08:00
    来自: http://msdn.microsoft.com/zh-cn/library/ms191241(SQL.90).aspx 索引键的最大大小在设计包含许多键列或大型列的索引时,计算索引键的大小以确保不超过最大索引键的大小。SQL Server 2005 为所有索引键列...
     
    
    索引键的最大大小

    在设计包含许多键列或大型列的索引时,计算索引键的大小以确保不超过最大索引键的大小。SQL Server 2005 为所有索引键列的最大总大小保留 900 字节。这排除了在非聚集索引的定义中包括的非键列。

    若要计算索引键的大小,请按下列步骤执行操作。

    1. 显示索引将依据的表列的属性。可以使用 sys.columns 目录视图执行此操作。
    2. 求索引键中将定义的每一列的长度之和。
      例如,以下语句聚合 Person.Address 表中指定列的 sys.columns 视图索引的 max_length 列。
      USE AdventureWorks;
      GO
      SELECT SUM(max_length)AS TotalIndexKeySize
      FROM sys.columns
      WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode')
      AND object_id = OBJECT_ID(N'Person.Address');
      ms191241.note(zh-cn,SQL.90).gif注意:
      如果表列为 Unicode 数据类型(例如,ncharnvarchar),则所显示的列长度是该列的存储长度。这是 CREATE TABLE 语句中指定的字符数的两倍。在前面的示例中,City 定义为 nvarchar(30) 数据类型;因此,该列的存储长度为 60。

    3. 如果总长度小于 900 字节,则该列可以作为索引键列。如果总长度超过 900 字节,则查看有关选项的以下信息和其他注意事项。
      CREATE INDEX 语句使用下列算法来计算索引键大小:
      • 如果所有固定键列的大小加上 CREATE INDEX 语句中指定的所有可变键列的最大大小小于 900 字节,则 CREATE INDEX 语句将成功完成,而不出现警告或错误。
      • 如果所有固定键列的大小加上所有可变键列的最大大小超过 900 字节,而所有固定键列的大小加上所有可变键列的最小大小小于 900 字节,则 CREATE INDEX 语句将成功执行,并显示一条警告,指示如果后续 INSERT 或 UPDATE 语句指定的值所生成的键值大于 900 字节,则该语句可能会失败。若表中现有数据行的值所生成的键值大于 900 字节,CREATE INDEX 语句将失败。若后续 INSERT 或 UPDATE 语句指定的数据值所生成的键值大于 900 字节,该语句将失败。
      • 如果所有固定键列的大小加上 CREATE INDEX 语句中指定的所有可变列的最小大小超过 900 字节,CREATE INDEX 语句将失败。
      下表总结了创建达到或超过最大索引键大小限制的索引的结果。

    可变长度列的最小大小 + 固定数据列的大小 可变长度列的最大大小 + 固定数据列的大小 现有行的索引键列长度总和的最大值* 是否创建索引 消息类型 由于索引键值过大导致 INSERT 或 UPDATE 运行时错误

    > 900 字节

    不相关

    不相关

    错误

    索引没有生成错误。

    <= 900 字节

    <= 900 字节

    不相关

    否。

    <= 900 字节

    > 900 字节

    <= 900 字节

    警告

    仅当所有索引列的当前长度之和大于 900 字节时。

    <= 900 字节

    > 900 字节

    > 900 字节

    错误

    索引没有生成错误。

    *在执行 CREATE INDEX 语句时,表中的任何行都不能有总长度超过 900 字节的索引键值。

    可以将非键列包含在非聚集索引中来避免 16 键列的最大当前索引大小限制和 900 字节的最大索引键大小。SQL Server 2005 数据库引擎 在计算索引键列数或索引键列的总大小时不考虑非键列。在具有包含性列的非聚集索引中,索引键列的总大小限制在 900 字节。所有非键列的总大小只受 INCLUDE 子句中所指定列的大小限制;例如,varchar(max) 列限制为 2 GB。INCLUDE 子句中的列可以为除 textntextimage 以外的所有数据类型。

    展开全文
  • 》一文,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的 我们一起来看一下InnoDB存储引擎索引 聚集索引...

    《面试官:为啥加了索引查询会变快?》一文中,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的

    我们一起来看一下InnoDB存储引擎中的索引

    聚集索引

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

    在这里插入图片描述

    (备注:真实的B+树叶子节点是通过链表相连的,这里只是为了说明聚集索引存储了行数据,凑合着看吧~)

    每张表只能拥有一个聚集索引。在多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外,由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值的查询。查询优化器能够快速发现某一段范围的数据页需要扫描

    辅助索引

    辅助索引(Secondary Index,也称非聚集索引),叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了指向主键的指针。

    辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过聚集索引来找到一个完整的行记录

    在这里插入图片描述

    联合索引

    联合索引是指对表上的多个列进行索引

    从本质上来说,联合索引也是一棵B+树,不同的是联合索引的键值的数量不是1,而是大于等于2

    联合索引有如下特点:

    最左前缀原则

    创建了(a,b,c)联合索引,如下几种情况都可以走索引:

    • select * from table where a = xxx;
    • select * from table where a = xxx and b = xxx;
    • select * from table where a = xxx and b = xxx and c = xxx

    如下几种情况不走索引

    • select * from table where b = xxx;
    • select * from table where c = xxx;
    • select * from table where b = xxx and c = xxx;

    本质上讲(a,b,c)联合索引等同于(a)单列索引、(a,b)联合索引、(a,b,c)联合索引三种索引的组合,符合最左前缀原则

    覆盖索引

    InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作

    • 非聚集索引上直接可以拿到所需数据,不需要再回表查,比如 select id from table where name = xxx;(id为主键、name为索引列)
    • 在统计操作中也会使用覆盖索引。比如(a,b)联合索引,select * from table where b = xxx语句按最左前缀原则是不会走索引的,但如果是统计语句select count(*) from table where b = xxx;就会使用覆盖索引。

    选择性

    并不是在所有的查询条件中出现的列都需要添加索引。对于什么时候添加B+树索引,一般的经验是,在访问表中很少一部分时使用B+树索引才有意义。对于性别字段、地区字段、类型字段,它们可取值的范围很小,称为低选择性

    按性别进行查询时,可取值的范围一般只有’M’、‘F’。因此上述SQL语句得到的结果可能是该表50%的数据(假设男女比例1∶1),这时添加B+树索引是完全没有必要的。相反,如果某个字段的取值范围很广,几乎没有重复,即属于高选择性,则此时使用B+树索引是最适合的

    所以,我们在添加索引的时候,要尽量选择高选择性的字段,反之你在低选择性的字段上加了字段,查询可能也不会走索引

    如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
    如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

    在这里插入图片描述

    展开全文
  • 聚集索引:指索引项的排序方式和表数据记录排序方式一致的索引 也就是说聚集索引的顺序就是数据的物理存储顺序。它会根据聚集索引键的顺序来存储表的数据,即对表的数据按索引键的顺序进行排序,然后重新存储到...

    目录

     

    首先介绍这些索引的概念:

    接着结合mysql进行讲解:


    首先介绍这些索引的概念:

    1、聚集索引

    聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引 

    也就是说聚集索引的顺序就是数据的物理存储顺序。它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索引键的顺序进行排序,然后重新存储到磁盘上。因为数据在物理存放时只能有一种排列方式,所以一个表只能有一个聚集索引。

    比如字典中,用‘拼音’查汉字,就是聚集索引。因为正文中字都是按照拼音排序的。而用‘偏旁部首’查汉字,就是非聚集索引,因为正文中的字并不是按照偏旁部首排序的,我们通过检字表得到正文中的字在索引中的映射,然后通过映射找到所需要的字。

    聚集索引的使用场合为: 

      a.查询命令的回传结果是以该字段为排序依据的; 

      b.查询的结果返回一个区间的值; 

      c.查询的结果返回某值相同的大量结果集。 

    聚集索引会降低 insert,和update操作的性能,所以,是否使用聚集索引要全面衡量。 

    2、非聚集索引: 索引顺序与物理存储顺序不同

    非聚集索引的使用场合为: 

      a.查询所获数据量较少时; 

      b.某字段中的数据的唯一性比较高时;

    非聚集索引必须是稠密索引

    3、聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。术语“聚族”表示数据行和相邻的键值紧凑的存储在一起。因为无法同时把数据行放在两个不同的地方,所以一个表只能有一个聚族索引。 

    聚族索引的优点 

    可以把相关数据保存在一起。就好像在操场上战队,一个院系一个院系的站在一起,这样要找到一个人,就先找到他的院系,然后在他的院系里找到他就行了,而不是把学校里的所有人都遍历一遍

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

    4、稠密索引

    稠密索引:每个索引键值都对应有一个索引项

    稠密索引能够比稀疏索引更快的定位一条记录。但是,稀疏索引相比于稠密索引的优点是:它所占空间更小,且插入和删除时的维护开销也小。


    5、稀疏索引

    稀疏索引:相对于稠密索引,稀疏索引只为某些搜索码值建立索引记录;在搜索时,找到其最大的搜索码值小于或等于所查找记录的搜索码值的索引项,然后从该记录开始向后顺序查询直到找到为止。 

     

    接着结合mysql进行讲解:

    mysql的两种数据存储方式,一种是InnoDB,一种是MyISAM。这两种存储都是基于B+树的存储方式,但是也有点不同。

    MyIsam 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。主索引和辅助索引没有区别都是非聚集索引。索引页正常大小为1024字节,索引页存放在.MYI 文件中。MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。

    InnoDB 也使用B+Tree作为索引结构,索引页大小16,和表数据页共同存放在表空间中。从InnoDB表数据存放方式可看出InnoDB表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

    InnoDB默认对主键建立聚簇索引。如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。一般来说,InnoDB 会以聚簇索引的形式来存储实际的数据,它是其它二级索引的基础。

    所以mysql innodb引擎的聚集索引、聚簇索引都默认是主键索引,如果没有指定主键,就是一个具有唯一且非空值的索引,如果不存在这样的索引,就是InnoDB自定义的隐藏主键索引,并且该索引是稠密索引。

    展开全文
  • 在本文,我们以 InnoDB 为例,介绍 MySQL 的索引结构以及其使用 B+ 树实现索引的原因。 表空间 首先,来了解一下 MySQL 的表空间。的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment...
  • 第一种就是仿饿了么点餐时,商品列表的悬停头部切换“动画效果”,如下: 第二种是一种头部折叠起来的视效,个人觉得也还不错~如下: 果然比上部残篇里的效果好看多了,那么代码多不多呢,看我的git show 记录: ...
  • mysql索引

    千次阅读 2019-08-18 10:33:10
    一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本 500 页的书,如果想快速找到其中的某一个知识点,在不借助目录的情况下,那估计得找一会儿。同样,对于数据库的表而言,索引...
  • 索引压缩

    千次阅读 2017-08-10 16:59:27
    就拿最常见的倒排索引来说,特别是当用户查询的关键词是常用词时,这些词所对应的倒排列表可以达到几百兆,而将这样庞大的索引由磁盘读入内存,势必会严重增加检索响应时间,影响用户的搜索体验。为了解决这样的问题...
  • MySQL使用全文索引(fulltext index) 及中文全文索引使用

    万次阅读 多人点赞 2019-07-24 10:52:56
    全文索引介绍 ----------------------------------------------------------------------------------------------------------------------------- 1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能...
  • 索引

    千次阅读 2019-07-10 18:14:31
    面试题:Mysql慢查询如何优化? 答: 建索引 索引是什么? 索引是一种优化查询的数据数据结构 索引为什么快? 使用B+tree的数据结构,能够快速筛选出需要的记录,避免全表扫描 为什么B+Tree快? 1 ,B+Tree拥有B-...
  • GIS空间索引

    万次阅读 2020-03-11 12:02:02
    在GIS系统,空间索引技术就是通过更加有效的组织方式,抽取与空间定位相关的信息组成对原空间数据的索引,以较小的数据量管理大量数据的查询,从而提高空间查询的效率和空间定位的准确性。 常见的GIS空间索引 KD...
  • 数据库索引的作用和优点缺点以及索引的11用法
  • 每个节点中子节点的个数不能超过 N,也不能小于 N/2(不然会造成页分裂或页合并) 根节点的子节点个数可以不超过 m/2,这是一个例外 m 叉树只存储索引,并不真正存储数据,只有最后一行的叶子节点存储行数据。 通过...
  • 非聚簇索引:数据存储和索引分开放,索引结构的叶子节点指向了数据的对应行,myisam通过 key_buffer 把索引先缓存到内存,当需要访问数据时(通过索引访问数据),在内存直接搜索索引,然后通过索引找到磁盘...
  • MySqlB+Tree索引原理

    千次阅读 2018-09-17 15:58:54
    B+树索引是B+树在数据库的一种实现,是最常见也是数据库使用最为频繁的一种索引。B+树的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...
  • 前言: 在前面一文,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理:对于索引不足的情况:检查缺少索引的情况...
  • [SQL SERVER]索引大小出现的问题.

    千次阅读 2007-05-07 15:01:00
    P1.过程的一段:Create Index g_Bom_001 On #g_Bom(pInvCode,cInvCode...索引 g_Bom_001 的最大长度为 1020 字节。对于较大值的某些组合,插入/更新操作将失败。求教 此错误 键长具体是指哪部分的东西?为谢。P2.MS
  • 内存数据库索引技术

    万次阅读 多人点赞 2015-01-07 12:16:37
    图2-1T-Tree的结点 T-tree索引用来实现关键字的范围查询。T-tree是一棵特殊平衡的...现在T-tree己经成为内存数据库最主要的一种索引方式。 T-tree具有以下特点:1)左子树与右子树之差不超过1,2)在一个存储节
  • 请写一个函数,输入是数组A和一个整数key,返回数组A中值小于key的最大元素的索引值。 分析:因为有序,故可以使用折半查找的思想,但是需要变通实现。 实现如下: #include int modifiedBinarySearch...
  • MySqlB+索引和ISAM索引介绍

    千次阅读 2013-01-22 20:10:47
    名词:索引顺序存取方法ISAM—Indexed Sequential Access Method 索引顺序存取方法(ISAM, Indexed Sequential Access Method)最初是IBM公司发展起来的一个文件系统,可以连续地(按照他们进入的顺序)或者任意...
  • MySQL 索引

    千次阅读 2020-07-06 09:17:38
    花了好久整理的 MySQL 索引笔记,赶紧收藏
  • Oracle-index索引解读

    万次阅读 2016-10-27 21:25:05
    概述Oracle-OLAP和OLTP解读Oracle-index索引解读Oracle-分区表解读Oracle-锁解读Oracle-等待事件解读Oracle-procedure/cursor解读 索引是数据库对象之一,用于加快数据的检索 索引是建立在表上的可选对象;索引的...
  • 1、创建索引的几种方式; 2、mysql索引知识; 3、mysql索引优化;
  • MySQLB+Tree索引原理

    万次阅读 多人点赞 2017-06-23 11:06:28
    B+树索引是B+树在数据库的一种实现,是最常见也是数据库使用最为频繁的一种索引。B+树的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...
  • Mysql索引详解

    千次阅读 多人点赞 2019-06-29 21:58:33
    索引的优缺点)1、索引产生的意义2、索引的优缺点二、索引的分类三、B树-数据库索引原理1、B树(平衡多路查找树)2、B+树3、B+树的优势四、聚合索引(InNoDB存储引擎)与非聚合索引(MyISAM存储引擎)1、聚合索引2...
  • MySQL索引原理

    万次阅读 多人点赞 2016-02-02 20:53:39
    B+树索引是B+树在数据库的一种实现,是最常见也是数据库使用最为频繁的一种索引。B+树的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...
  • mysql数据库索引与优化

    千次阅读 2009-01-07 12:09:00
    本文主要讲述了如何加速动态网站的MySQL索引分析和优化。 一、什么是索引索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描...
  • MongoDB中索引的创建和使用详解

    万次阅读 2013-01-04 17:47:22
    索引通常能够极大的提高查询的效率。在系统使用查询时,应该考虑建立相关的索引。在MongoDB创建索引相对比较容易。...当你在某种情况下需要在MySQL建立索引,这样的情景同样适合于MongoD
  • mysql的B+树索引

    千次阅读 多人点赞 2018-12-31 13:30:03
    B+树索引是B+树在数据库的一种实现,是最常见也是数据库使用最为频繁的一种索引。B+树的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,733
精华内容 47,893
关键字:

列表中最大索引小于列表大小