数据库联合索引?数据库索引有哪几种,怎样建立索引
今天给各位分享数据库联合索引的知识,其中也会对数据库索引有哪几种,怎样建立索引进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
如何创建聚集索引
问题一:如何用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);
数据库索引有哪几种,怎样建立索引
数据库索引的种类:
1、按照索引列值的唯一性,索引可分为唯一索引和非唯一索引
非唯一索引:B树索引
create index索引名 on表名(列名) tablespace表空间名;
唯一索引:建立主键或者唯一约束时会自动在对应的列上建立唯一索引
2、索引列的个数:单列索引和复合索引
3、按照索引列的物理组织方式
B树索引
create index索引名 on表名(列名) tablespace表空间名;
位图索引
create bitmap index索引名 on表名(列名) tablespace表空间名;
反向键索引
create index索引名 on表名(列名) reverse tablespace表空间名;
函数索引
create index索引名 on表名(函数名(列名)) tablespace表空间名;
删除索引
drop index索引名
重建索引
alter index索引名 rebuild
索引的创建格式:
CREATE UNIUQE| BITMAP INDEX<schema>.<index_name>
ON<schema>.<table_name>
(<column_name>|<expression> ASC| DESC,
<column_name>|<expression> ASC| DESC,...)
TABLESPACE<tablespace_name>
STORAGE<storage_settings>
LOGGING| NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS| COMPRESS<nn>
NOSORT| REVERSE
PARTITION| GLOBAL PARTITION<partition_setting>
UNIQUE| BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
<column_name>|<expression> ASC| DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”
TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
STORAGE:可进一步设置表空间的存储参数
LOGGING| NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
COMPUTE STATISTICS:创建新索引时收集统计信息
NOCOMPRESS| COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
NOSORT| REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
PARTITION| NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区
使用USER_IND_COLUMNS查询某个TABLE中的相应字段索引建立情况
使用DBA_INDEXES/USER_INDEXES查询所有索引的具体设置情况。
在Oracle中的索引可以分为:B树索引、位图索引、反向键索引、基于函数的索引、簇索引、全局索引、局部索引等,下面逐一讲解:
一、B树索引:
最常用的索引,各叶子节点中包括的数据有索引列的值和数据表中对应行的ROWID,简单的说,在B树索引中,是通过在索引中保存排过续的索引列值与相对应记录的ROWID来实现快速查询的目的。其逻辑结构如图:
可以保证无论用户要搜索哪个分支的叶子结点,都需要经过相同的索引层次,即都需要相同的I/O次数。
B树索引的创建示例:
create index ind_t on t1(id);
注1:索引的针对字段创建的,相同字段不能创建一个以上的索引;
注2:默认的索引是不唯一的,但是也可以加上unique,表示该索引的字段上没有重复值(定义unique约束时会自动创建);
注3:创建主键时,默认在主键上创建了B树索引,因此不能再在主键上创建索引。
二、位图索引:
有些字段中使用B树索引的效率仍然不高,例如性别的字段中,只有“男、女”两个值,则即便使用了B树索引,在进行检索时也将返回接近一半的记录。
所以当字段的基数很低时,需要使用位图索引。(“低”的标准是取值数量<行数*1%)
位图索引的逻辑结构如上图所示:索引中不再记录rowid和键值,而是将每个值作为一列,用0和1表示该行是否等于该键值(0表示否;1表示是)。其中位图索引的行顺序与原表的行顺序一致,可以在查询数据的过程中对应计算出行的原始物理位置。
位图索引的创建示例:
create bitmap index ind_t on t1(type);
注:位图索引不可能是唯一索引,也不能进行键值压缩。
三、反向键索引:
考虑这个情况:某一字段的值是1-1000顺序排列,建立B树索引后依旧递增,到后来该B数索引不断在后面增加分支,会形成如下如的不对称树:
反向键索引是一种特殊的B树索引,在存储构造中与B树索引完全相同,但是针对数值时,反向键索引会先反向每个键值的字节,然后对反向后的新数据进行索引。例如输入2008则转换为8002,这样当数值一次增加时,其反向键在大小中的分布仍然是比较平均的。
反向键索引的创建示例:
createindex ind_t on t1(id) reverse;
注:键的反转由系统自行完成。对于用户是透明的。
四、基于函数的索引:
有的时候,需要进行如下查询:select* from t1 where to_char(date,'yyyy')>'2007';
但是即便在date字段上建立了索引,还是不得不进行全表扫描。在这种情况下,可以使用基于函数的索引。其创建语法如下:
create index ind_t on t1(to_char(date,'yyyy'));
注:简单来说,基于函数的索引,就是将查询要用到的表达式作为索引项。
五、全局索引和局部索引:
这个索引貌似很复杂,其实很简单。总得来说一句话,就是无论怎么分区,都是为了方便管理。
具体索引和表的关系有三种:
1、局部分区索引:分区索引和分区表1对1
2、全局分区索引:分区索引和分区表N对N
3、全局非分区索引:非分区索引和分区表1对N
创建示例:
首先创建一个分区表
createtable student
(
stuno number(5),
sname vrvhar2(10),
deptno number(5)
)
partition by hash(deptno)
(
partition part_01 tablespace A1,
partition part_02 tablespace A2
);
创建局部分区索引(1v1):
create index ind_t on student(stuno)
local(
partition part_01 tablespace A2,
partition part_02 tablespace A1
);--local后面可以不加
创建全局分区索引(NvN):
create index ind_t on student(stuno)
globalpartition by range(stuno)
(
partition p1 values less than(1000) tablespace A1,
partition p2 values less than(maxvalue) tablespace A2
);--只可以进行range分区
创建全局非分区索引(1vN)
createindex ind_t on student(stuno) GLOBAL;
如何正确合理的建立MYSQL数据库索引
如何正确合理的建立MYSQL数据库索引
索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。
在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL
);我们随机向里面插入了10000条记录,其中有一条:5555, admin。
在查找username="admin"的记录 SELECT* FROM mytable WHERE
username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
MySQL索引类型包括:
(1)普通索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
◆创建索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
◆修改表结构
ALTER mytable ADD INDEX [indexName] ON(username(length))
◆创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
INDEX [indexName](username(length)));删除索引的语法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
◆创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
◆修改表结构
ALTER mytable ADD UNIQUE [indexName] ON(username(length))
◆创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
UNIQUE [indexName](username(length)));
(3)主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID));当然也可以用 ALTER命令。记住:一个表只能有一个主键。
(4)组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
city VARCHAR(50) NOT NULL, age INT NOT NULL);
为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:
ALTER TABLE mytable ADD INDEX name_city_age(name(10),city,age);
建表时,usernname长度为 16,这里用
10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。
如果分别在
usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。
建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:
usernname,city,age usernname,city usernname为什么没有
city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
SELECT* FROM mytable WHREE username="admin" AND city="郑州" SELECT* FROM
mytable WHREE username="admin"而下面几个则不会用到:
SELECT* FROM mytable WHREE age=20 AND city="郑州" SELECT* FROM mytable WHREE
city="郑州"
(5)建立索引的时机
到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:
SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username
WHERE m.age=20 AND m.city='郑州'
此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。
刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:
SELECT* FROM mytable WHERE username like'admin%'而下句就不会使用:
SELECT* FROM mytable WHEREt Name like'%admin'因此,在使用LIKE时应注意以上的区别。
(6)索引的不足之处
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:
◆虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
◆建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
(7)使用索引的注意事项
使用索引时,有以下一些技巧和注意事项:
◆索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
◆使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
◆索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order
by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
◆like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like“%aaa%”不会使用索引而like
“aaa%”可以使用索引。
◆不要在列上进行运算
select* from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select* from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作
以上,就对其中MySQL索引类型进行了介绍。
OK,本文到此结束,希望对大家有所帮助。