如何创建聚集索引

如何创建聚集索引,第1张

问题一:如何用sql语句在列上建立聚集索引 可以用如下语句

create clustered index 索引名 on 表名(字段名)

问题二:如何设置聚集索引(Cluster Index) 一、使用 SQL Server Management Studio

使用对象资源管理器创建聚集索引

在“对象资源管理器”中,展开要创建聚集索引的表。

右键单击“索引”文件夹,指向“新建索引”,然后选择“聚集索引…”。

在“新建索引”对话框的“常规”页中,在“索引名称”框中输入新索引的名称。

在“索引键列”下,单击“添加…”。

在“从 table_name 中选择列”对话框中,选中要添加到聚集索引的表列的复选框。

单击“确定”。

在“新建列”对话框中,单击“确定”。

使用表设计器创建聚集索引

在“对象资源管理器”中,展开要使用聚集索引创建表的数据库。

右键单击“表”文件夹,然后单击“新建表…”。

右键单击上面创建的新表,然后单击“设计”。

在“表设计器”菜单上,单击“索引/键”。

在“索引/键”对话框中,单击“添加”。

从“选定的主/唯一键或索引”文本框中选择新索引。

在网格中,选择“创建为聚集的”,然后从该属性右侧的下拉列表中选择“是”。

单击“关闭”。

在“文件”菜单上,单击“保存 table_name”。

二、使用 Transact-SQL

创建聚集索引

在“对象资源管理器”中,连接到 数据库引擎的实例。

在标准菜单栏上,单击“新建查询”。

将以下示例复制并粘贴到查询窗口中,然后单击“执行”。

USE yourdatabase

GO

CREATE TABLE dbo.TestTable

(TestCol1 int NOT NULL,

TestCol2 nchar(10) NULL,

TestCol3 nvarchar(50) NULL)

GO

-- Create a clustered index called IX_TestTable_TestCol1

-- on the dbo.TestTable table using the TestCol1 column.

CREATE CLUSTERED INDEX IX_TestTable_TestCol1

ON dbo.TestTable (TestCol1)

GO

问题三:SQL中怎么创建非聚集索引 --创建非聚集索引create nonclustered index inx_entry_stock_ on entry_stock_d(entry_stock_bi) --延伸:--创建聚集索引create clustered index inx_entry_stock_bi on entry_stock_d(entry_stock_bi) --创建主键create table yourtable (id int primary key,name varchar (50))--增加主键alter table entry_stock_d add primary key nonclustered--主键且非聚集( entry_stock_bi,aid)

--除此以外还可以通过SQL Server Management Studio 右击表 -》设计-》 右击列 根据右键菜单 建立主键和索引

问题四:数据库怎样创建一个唯一聚集索引 在 Microsoft SQL Server 数据库中,您可以创建聚集索引。在聚集索引中,表中行的物理顺序与索引键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

创建聚集索引

在对象资源管理器中,右键单击要为其创建聚集索引的表,然后单击“设计”。

此时,将在表设计器中打开该表。

在表设计器菜单上,单击“索引/键”。

在“索引/键”对话框中,单击“添加”。

从“选定的主/唯一键或索引”列表中选择新创建的索引。

在网格中,选择“创建为聚集的”,然后从该属性右侧的下拉列表中选择“是”。

保存表时将在数据库中创建该索引。

问题五:有了聚集索引,为什么还要让我创建非聚集索引 你也可以不创建。但是有索引在读取的时候会更快。但是插入的时候有可可能会变慢,这种现象得表中的数据到达一定级别的时候才会比较明显。

聚集索引和非聚集索引不冲突。聚集索引只能有一个,非聚集可以有多个

聚集索引是:将数据在物理上排序,比如,图书馆的的书,从编号1开始按数字,1,2,3,4,5这样一直排列下来,这里的 1,2,3,4,5就可以建立聚集索引,检索的时候假设你检索 >4的数据就很快。

非聚集是索引是:将数据在逻辑上排序。比如图书馆的书,按照语音 将中文的放到 A区,将英文放在B区,然后又按照图书的类目,比如 文学类 放在 B曲区的 1号货架,历史图书放在B区的2号货架,这样逻辑上的排序是非聚集索引。

手打,累。。。。这是最基本的。索引在表创建的时候有很大学问。我也是皮毛。自己深入研究吧

问题六:在SQLSERVER中怎么创建聚集索引 CREATE CLUSTERED INDEX CLUSTER_id ON TABLE_name(ID)

问题七:什么叫聚集索引,建立索引的好处。 1、聚集索引:又叫聚簇索引,物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列 CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW(允许有重复记录的聚簇索引) 2、非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)3、索引的好处: 1)创建唯一性索引,保证数据库表中每一行数据的唯一性2)大大加快数据的检索速度,这也是创建索引的最主要的原因3)加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。5)通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。 4、索引的缺点: 1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空 间, 如果要建立 聚簇索引,那么需要的空间就会更大。3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

问题八:MySQL中怎样创建聚集索引和非聚集索引,求创建这两种索引的SQL语句。谢谢 InnoDB按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键然后在上面进行聚集。

所以,对于 聚集索引 来说,你创建主键的时候,自动就创建了主键的聚集索引。

而普通索引(非聚集索引)的语法,大多数数据库都是通用的:

CREATE INDEX Syntax

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[index_type]

ON tbl_name (index_col_name,...)

[index_type]

index_col_name:

col_name [(length)] [ASC | DESC]

index_type:

USING {BTREE | HASH | RTREE}

[java] view plaincopy

-- 创建无索引的表格

create table testNoPK (

id int not null,

name varchar(10)

)

-- 创建普通索引

create index IDX_testNoPK_Name on testNoPK (name)

问题九:怎么用两个字段联合建立聚集索引 怎么用两个字段联合建立聚集索引

如何用sql语句在列上建立聚集索引可以用如下语句create clustered index 索引名 on 表名(字段名)

问题十:SQL中怎么创建非聚集索引 --格式:--CREATE INDEX 索引名称 ON 表名 (索引字段)--例:CREATE INDEX INX_TABLEA ON TABLEA(F1,F2,F3)

       本节课主要关注InnoDB,但是这里讨论的原理对于任何支持聚簇索引的存储引擎都是适用的。

       叶子节点包含了全部数据,其他节点只包含索引列。InnoDB将通过主键聚集数据,也就是说上图中的“被索引的列”就是主键列。如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引InnoDB会隐式定义一个主键来作为聚簇索引。

       如果主键比较大的话,那辅助索引将会变的更大,因为 辅助索引的叶子存储的是主键值;过长的主键值,会导致非叶子节点占用占用更多的物理空间

所以建议使用int的auto_increment作为主键

       主键的值是顺序的,所以 InnoDB 把每一条记录都存储在上一条记录的后面。当达到页的最大值时,下一条记录就会写入新的页中。一旦数据按照这种顺序的方式加载,主键页就会近似于被顺序的记录填满。

       聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些 *** 作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

       因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址必然是凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转。聚簇索引则只需一次I/O。(强烈的对比)

       不过,如果涉及到大数据量的排序、全表扫描、count之类的 *** 作的话,还是MyISAM占优势些,因为索引所占空间小,这些 *** 作是需要在内存中完成的。

       MyISM使用的是非聚簇索引, 非聚簇索引的两棵B+树看上去没什么不同 ,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于 索引树是独立的,通过辅助键检索无需访问主键的索引树

       所以说,聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。 一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引 ,这个要看实际情况。

       聚簇索引和非聚簇索引的数据分布有区别,主键索引和二级索引的数据分布也有区别,通常会让人感到困扰和以外,下面通过一个列子来讲解InnoDB和MyISAM是如何存储数据的:

       该表的主键取值1~10000,按照随机顺序插入并使用optimize table命令做了优化。换句话说,数据在磁盘上的存储方式已是最优,但行的顺序是随机的。列col2的值是从1~100之间随机赋值,所以有很多重复的值。

       MyISAM的数据分布很简单,所以先介绍它。MyISAM按照数据插入的顺序存储在磁盘上,如下图所示:

在行的旁边显示行号,从0开始递增。因为行是定长的,所以MyISAM可以从表的开头跳过所需的字节找到需要的行。

col2上的索引

       事实上,MyISAM中主键索引和其他索引在结构上没有什么不同。主键索引就是一个名为PRIMARY的唯一非空索引。

       InnoDB支持聚簇索引,所以使用不同的方式存储同样的数据。

       第一眼看上去,感觉和前面的没什么区别,但是该图显示了整个表,而不是只有索引。因为在InnoDB中,聚簇索引就是表,所以不像MyISAM那样需要独立的行存储,这也是为什么MyISAM索引和数据结构是分开的。

       聚簇索引的每一个叶子节点都包含了主键值。事务ID、用于事务和MVCC的回滚指针以及所有的剩余列。如果主键是一个列前缀索引,InnoDB也会包含完整的主键列和剩下的其他列。

       还有一点和MyISAM不同的是,InnoDB的二级索引和聚簇索引很不相同。InnoDB的二级索引的叶子节点中存储的不是“行指针”,而是主键值,并以此作为指向行的“指针”。这样的策略减少了当出现行移动或者数据页分裂时二级索引的维护工作。使用主键值当作指针会让二级索引占用更多的空间,换来的好处是,InnoDB在移动时无需更新二级索引中的这个“指针”。

       我们在来看一下 col2索引

       每一个叶子节点包含了索引列(这里是col2),紧接着是主键值(col1),上图我们省略了非叶子节点这样的细节。InnoDB非叶子节点包含了索引列和一个指向下一级节点的指针。

       最后,以一张图表示InnoDB和MyISAM保存数据和索引的区别。

       前面讲过,最好使用AUTO_INCREMENT自增列来聚集数据,避免随机的、不连续的、值分布范围大的列做聚簇索引,特别是对于I/O密集型的应用。例如,从性能角度考虑,使用UUID来作为聚簇索引则会很糟糕:他使得聚簇索引的插入变得完全随机,这是最坏的情况,使得数据没有任何聚集特性。

       为了演示这一点,我们做两个基准测试:

1、使用证书ID插入userinfo表,和uuid作为主键的userinfo_uuid表

       userinfo_uuid表跟userinfo表除了主键给为UUID,其他字段都一样

       测试这两个表的设计,首先在一个有足够内存容纳索引的服务器上向这两个表各插入100万条记录。然后向两个表继续插入300万数据,使索引的大小超过服务器的内存容量。测试结果如下:

       向UUID主键插入行不仅花费的时间更长,而且索引占用的空间也更大。这一方面是由于主键字段更长,另一方面毫无疑问是由于页分裂和碎片导致的。

       为了明白为什么会这样,来看看往第一个表中插入数据时,索引发生了什么变化。

自整型主键插入

       因为主键是顺序的,所以InnoDB把每一条记录都存在上一条记录的后面。当达到页的最大容量后,下一条记录就会写入到新的页中。一旦数据按照这种顺序的方式加载,主键页就会近似于被顺序的记录填满,这也正是所期望的结果。

UUID插入

       因为新行的主键值不一定比之前插入的大,所以InnoDB无法简单的总是把新行插入到索引的最后,而是需要为新的行寻找合适的位置,通常是已有数据的中间位置,并且分配空间。这会正价很多的额外工作,并导致数据分布不够优化。

缺点:

把这些随机值载入到聚簇索引后,也许需要做一次OPTIMIZE TABLE来重建表并优化页的填充。

结论 :使用InnoDB时应尽可能地按主键顺序插入数据,并且尽可能地单调增加聚簇键的值来插入新行。

1 :clustered index 其实数据存储结构,索引和记录(全部)内容保存同一个结构中。“聚簇”就是索引和记录紧密在一起,分开就不是聚簇索引了,所以一张表只能有唯一的聚簇索引。

--(除此之外的表上的每个非聚簇索引都是 ,又叫辅助索引(secondary indexes))

————————————————

2 非聚簇索引:secondary index ,叶子节点保存了主键值,要定位记录还要再查一遍聚簇索引。

————————————————

3 覆盖索引:覆盖索引是指索引的叶子节点已包含所有要查询的列,因此不需要访问表数据(回表~~有学个名词,查询聚簇索引)

查找时能不能直接定位:聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

————————————————

4 联合索引又叫复合索引。

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11680216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存