SQLSERVER 索引
目录
A.基础概念
B.实际语法规则
C.使用中注意事项
A.基础概念
平衡树
首先你要对sqlserver 中的自平衡树有一定了解,具体的说,就是在执行增删改的是时候,这个“树” 是如何维持自平衡的,通过了解自平衡树后,你会知道:
1.索引一种用空间换时间的做法。
2.对于经常更新的列,不适于用索引。
3.删除时,有空间的浪费。
索引的种类:
1.聚集索引
聚集索引存储记录是物理上连续存在,(在查询的时候,可以大大减少磁盘移动臂的移动,提高查询速度)
一个表只能有一个聚集索引。
2.非聚集索引
而非聚集索引是逻辑上的连续,物理存储并不连续
可以有多个非聚集索引
B.实际语法规则
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [with[PAD_INDEX][[,]FILLFACTOR=fillfactor] [[,]IGNORE_DUP_KEY] [[,]DROP_EXISTING] [[,]STATISTICS_NORECOMPUTE] [[,]SORT_IN_TEMPDB] ] [ ON filegroup ]
CREATE INDEX命令创建索引各参数说明如下:
UNIQUE:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。
CLUSTERED:用于指定创建的索引为聚集索引。
NONCLUSTERED:用于指定创建的索引为非聚集索引。
index_name:用于指定所创建的索引的名称。
table:用于指定创建索引的表的名称。
view:用于指定创建索引的视图的名称。
ASC|DESC:用于指定具体某个索引列的升序或降序排序方向。
Column:用于指定被索引的列。
PAD_INDEX:用于指定索引中间级中每个页(节点)上保持开放的空间。
FILLFACTOR = fillfactor:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor的值为1到100。
IGNORE_DUP_KEY:用于控制当往包含于一个唯一聚集索引中的列中插入重复数据时SQL Server所作的反应。
DROP_EXISTING:用于指定应删除并重新创建已命名的先前存在的聚集索引或者非聚集索引。
STATISTICS_NORECOMPUTE:用于指定过期的索引统计不会自动重新计算。
SORT_IN_TEMPDB:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。
ON filegroup:用于指定存放索引的文件组。
C.使用中注意事项
1.将索引资源浪费在主键(ID)上
当建立主键的时候,聚集索引自动(默认)建立了
改进方法一
在建表的时候,就指定NONCLUSTERED
CREATE TABLE productInfo( ID INT NOT NULL PRIMARY KEY NONCLUSTERED IDENTITY(1,1), --指明为:NONCLUSTERED PNAME NVARCHAR(200), REMARK NVARCHAR(200) )
改进方法二
--查找主键约束名称 EXEC sp_helpconstraint productInfo --找到约束名:PK__productI__3214EC2708EA5793 --删除约束: ALTER TABLE productInfo DROP CONSTRAINT PK__productI__3214EC2708EA5793 --新建索引 CREATE CLUSTERED INDEX CLU_NAME ON productInfo(PNAME) --再重新添加主键 ALTER TABLE productInfo ADD PRIMARY KEY(ID)
对于一般的表,删除要更具ID,更新也要根据ID,GROUP BY,ORDER BY 也搞根据ID,分页也要根据ID,那么在这种情况下将唯一的聚集索引使用在ID上,是最好的选择
但是,下面这种情况就不适合了。
招聘网站
购物网站
此时,很明显要将索引利用在职位 和 商品名称两个字段上
2.使用了索引,就一定会使用索引查找?
测试数据
INSERT INTO productInfo VALUES('SONY手机','GOOD') INSERT INTO productInfo VALUES('APPLE手机','NICE') INSERT INTO productInfo VALUES('LX手机','BAD')
结果:
不走索引路线的操作还有:
--和非索引字段混合 SELECT * FROM productInfo WHERE PNAME='XX' AND REMARK='APPLE' SELECT * FROM productInfo WHERE PNAME='XX' OR REMARK='APPLE' --执行运算 也包括 加减乘除:ABS(价格)<5000 价格*2>5000 SELECT * FROM productInfo WHERE LTRIM(PNAME) LIKE 'APPLE%' SELECT * FROM productInfo WHERE LOWER(PNAME) LIKE 'APPLE%'