当前位置:首页 » 服务存储 » 怎么存储背包索引
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

怎么存储背包索引

发布时间: 2022-05-03 09:21:47

⑴ 索引怎么建立使用

Create Relational Index
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

参数
UNIQUE
为表或视图创建唯一索引。唯一索引不允许两行具有相同的索引键值。视图的聚集索引必须唯一。

无论 IGNORE_DUP_KEY 是否设置为 ON,数据库引擎都不允许为已包含重复值的列创建唯一索引。否则,数据库引擎会显示错误消息。必须先删除重复值,然后才能为一列或多列创建唯一索引。唯一索引中使用的列应设置为 NOT NULL,因为在创建唯一索引时,会将多个 Null 值视为重复值。

CLUSTERED
创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。聚集索引的底层(或称叶级别)包含该表的实际数据行。一个表或视图只允许同时有一个聚集索引。

具有唯一聚集索引的视图称为索引视图。为一个视图创建唯一聚集索引会在物理上具体化该视图。必须先为视图创建唯一聚集索引,然后才能为该视图定义其他索引。

在创建任何非聚集索引之前创建聚集索引。创建聚集索引时会重新生成表中现有的非聚集索引。

如果没有指定 CLUSTERED,则创建非聚集索引。

注意:
因为按照定义,聚集索引的叶级别与其数据页相同,所以创建聚集索引和使用 ON partition_scheme_name 或 ON filegroup_name 子句实际上会将表从创建该表时所在的文件组移到新的分区方案或文件组中。对特定的文件组创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。

NONCLUSTERED
创建一个指定表的逻辑排序的索引。对于非聚集索引,数据行的物理排序独立于索引排序。

无论是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建索引,还是使用 CREATE INDEX 显式创建索引。每个表都最多可包含 999 个非聚集索引。

对于索引视图,只能为已定义唯一聚集索引的视图创建非聚集索引。

默认值为 NONCLUSTERED。

index_name
索引的名称。索引名称在表或视图中必须唯一,但在数据库中不必唯一。索引名称必须符合标识符的规则。

column
索引所基于的一列或多列。指定两个或多个列名,可为指定列的组合值创建组合索引。在 table_or_view_name 后的括号中,按排序优先级列出组合索引中要包括的列。

一个组合索引键中最多可组合 16 列。组合索引键中的所有列必须在同一个表或视图中。组合索引值允许的最大大小为 900 字节。

不能将大型对象 (LOB) 数据类型 ntext、text、varchar(max)、 nvarchar(max)、varbinary(max)、xml 或 image 的列指定为索引的键列。另外,即使 CREATE INDEX 语句中并未引用 ntext、text 或 image 列,视图定义中也不能包含这些列。

如果 CLR 用户定义类型支持二进制排序,则可以为该类型的列创建索引。另外,对于已定义为用户定义类型列的方法调用的计算列,只要这些方法标记为确定性方法且不执行数据访问操作,便可为该计算列创建索引。

[ ASC | DESC ]
确定特定索引列的升序或降序排序方向。默认值为 ASC。

INCLUDE ( column [ ,...n ] )
指定要添加到非聚集索引的叶级别的非键列。非聚集索引可以唯一,也可以不唯一。

在 INCLUDE 列表中列名不能重复,且不能同时用于键列和非键列。

除 text、ntext 和 image 之外,允许所有数据类型。如果指定的任一非键列属于 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型,则必须脱机 (ONLINE = OFF) 创建或重新生成该索引。

精确或不精确的确定性计算列都可以是包含列。从 image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml 数据类型派生的计算列可以包含在非键列中,前提是允许将这些计算列数据类型作为包含列。

WHERE <filter_predicate>
通过指定索引中要包含哪些行来创建筛选索引。筛选索引必须是对表的非聚集索引。为筛选索引中的数据行创建筛选统计信息。

筛选谓词使用简单比较逻辑且不能引用计算列、UDT 列、空间数据类型列或 hierarchyID 数据类型列。比较运算符不允许使用 NULL 文本的比较。请改用 IS NULL 和 IS NOT NULL 运算符。

下面是 Proction.BillOfMaterials 表的筛选谓词的一些示例:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

筛选索引不适用于 XML 索引和全文索引。对于 UNIQUE 索引,仅选定的行必须具有唯一的索引值。筛选索引不允许有 IGNORE_DUP_KEY 选项。

ON partition_scheme_name ( column_name )
指定分区方案,该方案定义要将分区索引的分区映射到的文件组。必须通过执行 CREATE PARTITION SCHEME 或 ALTER PARTITION SCHEME,使数据库中存在该分区方案。column_name 指定将作为分区索引的分区依据的列。该列必须与 partition_scheme_name 使用的分区函数参数的数据类型、长度和精度相匹配。column_name 不限于索引定义中的列。除了在对 UNIQUE 索引分区时,必须从用作唯一键的列中选择 column_name 外,还可以指定基表中的任何列。通过此限制,数据库引擎可验证单个分区中的键值唯一性。

注意:
在对非唯一的聚集索引进行分区时,如果尚未指定分区依据列,则默认情况下数据库引擎将在聚集索引键列表中添加分区依据列。在对非唯一的非聚集索引进行分区时,如果尚未指定分区依据列,则数据库引擎会添加分区依据列作为索引的非键(包含)列。

如果未指定 partition_scheme_name 或 filegroup 且该表已分区,则索引会与基础表使用相同分区依据列并被放入同一分区方案中。

有关将索引分区的详细信息,请参阅已分区索引的特殊指导原则。

ON filegroup_name
为指定文件组创建指定索引。如果未指定位置且表或视图尚未分区,则索引将与基础表或视图使用相同的文件组。该文件组必须已存在。

ON "default"
为默认文件组创建指定索引。

在此上下文中,“default”不是关键字。它是默认文件组的标识符,并且必须进行分隔(类似于 ON "default" 或 ON[default])。如果指定了 "default",则当前会话的 QUOTED_IDENTIFIER 选项必须为 ON。这是默认设置。
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
在创建聚集索引时,指定表的 FILESTREAM 数据的位置。FILESTREAM_ON 子句用于将 FILESTREAM 数据移动到不同的 FILESTREAM 文件组或分区方案。

filestream_filegroup_name 是 FILESTREAM 文件组的名称。该文件组必须包含一个使用 CREATE DATABASE 或 ALTER DATABASE 语句为该文件组定义的文件;否则,将引发错误。

如果表已分区,则必须包含 FILESTREAM_ON 子句并且必须指定 FILESTREAM 文件组的分区方案,且此分区方案需使用与该表分区方案相同的分区函数和分区列。否则将引发错误。

如果该表未分区,则无法对 FILESTREAM 列分区。该表的 FILESTREAM 数据必须存储在一个由 FILESTREAM_ON 子句指定的文件组中。

如果创建的是聚集索引且该表不包含 FILESTREAM 列,则可在 CREATE INDEX 语句中指定 FILESTREAM_ON NULL。

⑵ 数据库索引有哪几种,怎样建立索引

数据库索引的种类:

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来实现快速查询的目的。其逻辑结构如图:

反向键索引是一种特殊的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;

⑶ 存储在HDFS上的文件如何构建索引

非常感觉您的回答。solr原理只是说了可以通过MR构建索引,但是如何通过MR批量构建索引(有简单的可以运行的例子吗?)我还是不太清楚,新手刚接触这方面,多多包涵!是只要在solr上配置hdfs路径就可以自己构建索引还是要自己写代码提交MR任务?直接通过MR从hdfs上读取数据构建索引和在hbase构建索引哪种方式好些?

⑷ 按照存储结构划分,索引分为哪两类各有何作用

聚集索引:对表在物理数据页中的数据排列进行排序,然后重新存储到磁盘上,表中的数据行只能以一种方式存储在磁盘上,故一个表只能有一个聚集索引。创建任何非聚集索引之前必须创建聚集索引。

非聚集索引:具有完全独立于数据行的结构,使用非聚集索引不会影响数据表中记录的实际存储顺序。



(4)怎么存储背包索引扩展阅读

优点

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显着减少查询中分组和排序的时间。

缺点

1.索引需要占物理空间。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

⑸ 索引一般以文件形式存储在磁盘上,怎么存

这要看是哪类索引文件了,不同的程序,建立索引文件的格式也会是不同的。保存和调用的方法,也是由程序所决定的。

⑹ 定量背包PASCAL

如果K是未指定的,
f(m,volume) = 0 m=0时
f(m,volume) = f(m-1,volume) volume-vol[m]<0时
f(m,volume)
= max { value[m]+f(m-1,volume-vol[m]) , f(m-1,volume) }
f(m,volume)指从编号为1到m的物品中选取总体积不超过volume的物品所能达到的最大价值。
f(N,V)即为所求。

如果K是指定的,
f(m,L,volume)
= max { value[m]+f(m-1,L-1,volume-vol[m]) , f(m-1,L,volume)}
f(m,L,volume) = 0 l=0或m<l时
f(m,L,volume) = f(m-1,L,volume) volume-vol[m]<0时
f(m,L,volume)指从编号为1到m的物品中选取总体积不超过volume的L个物品所能达到的最大价值。
f(N,K,V)即为所求。
至于记录选取物品情况,可以用字符串或数组记录。如N=8,现在从1到6中选,如果选取6,从1到5中选取的结果是00001010,不选6,从1到5中选取的结果是00010011,那么就看00101010(第6位置1)和00010011哪个的价值大,便把所求的f和相应的串作为返回值。
有很多地方重复计算了,可以优化剪枝,不过程序就会比较复杂了。

补充:

我说的K未指定时的方法实际上就是6楼所用到的方法,从编号为1到i的物品中取出总体积不超过t的物品使得总价值最大,无非分两种情形,一种是不取物品n,从1到n-1中选取总体积不超过t的物品使价值最大;另一种是选取物品i,然后从1到i-1中选取总体积不超过t-tt[i]的物品使价值最大。这两种情况中总价值更大的那个即为所求。

本来这是要用递归来完成的,非递归方法则要用到栈,但是若每个物品的体积都是正整数的话,则可以用递推方法来完成。6楼正是用的此种方法。

二重循环中,外层循环是物品编号1到N,内层循环是体积V到0,其中i=k一个循环下来,数组b[]的每个元素b[j]中存储了从物品1到k中选取物品使得体积之和刚好为j,所能达到的最大价值,若a[j]=false,则表示无法选取物品组合使得体积之和恰好为j,此时相对应的b[j]=0。

例如物品5的体积为tt[5]=8,价值为w[5]=13,i=4循环结束时,b[8]=0,b[28]=46,b[29]=0,b[36]=55,那么i=5循环结束后,由于a[0]=true,于是a[0+tt[5]]即a[8]=true,b[8]显然由原来的0变为15,b[28]+w[5]=59>b[28+tt[5]]=55,于是b[36]变为59,而a[29]=false,b[29]=0,因而a[37]和b[37]保持不变。最后i=N循环结束后,b[1]到b[V]z中的最大者,即为所求。

若是体积不是整数,使精确到小数点后两位的数,可以将物品体积和指定的V全部扩大100倍,化为整数问题来解决。

6楼程序里的判断语句中的(j+tt[i]<=t) 一项可以去掉,但是数组a[]、b[]的范围要重新设,因为最后j+tt[i]会达到所有N个物品的总体积。最后仍在b[1]到b[V]中去最大值,超过V的那些b[]不理。

7楼的方法则是要求价值p为正整数,外层循环仍然是物品编号,内层循环则是价值p从P到0,P为所有物品的总价值。

思路如下,从编号为1到k的物品中取出总价值不低于p的物品使得总体积最小,同样分取和不取物品k两种情形,取两种情形中体积小者。

程序实现和6楼类似,只不过b[]换成f[p],表示从1到k中选取物品使价值之和恰好为p,所能达到的最小体积。外层最后一轮循环k=N结束后,从f[1]到f[P]中寻找小于V的那些f[p],其中最大的那个p极为所求。

取法记录:C中可以用数组、结构、枚举来记录。比如对于6楼的方法,增设一个M[V][N]记录取法。M[35][]={1,0,1,0,0,...0,1,0}表示取第1、3、N-1个物品,这三个物品的体积之和为35,上面举例中b[8]和b[36]发生改变,于是M[8][]和M[36][]要相应改变,即M[8][5]和M[36][5]由0遍1,这里5代表第五个元素,不是按C的习惯代表第六个元素。

K指定的话方法其实是一样的,分两种情况讨论。我最早学的BASIC,后来就是C,pascal泛泛浏览过,没写过pascal程序,现在是能读不能写。只好说明大致的思路如下:

value[1]到value[N],vol[1]到vol[N]为物品价值,体积,V为背包体积,K为要取的物品个数。

if L=0 or m<L then return 0 and return pickup=none //要取0个物品或是要取物品数大于剩余物品数当然是只有什么都不取了

if volume-vol[m]<0 then f(m,L,volume) = f(m-1,L,volume) return f and pickup //物品m体积大于剩余空间,只有考虑不取物品m,从1到m-1中取L件的情况了,pickup不变

f(m,L,volume) = max { value[m]+f(m-1,L-1,volume-vol[m]) , f(m-1,L,volume)} //以上两种情况都不成立的话,那么就分两种情况了,一是去m,从1到m-1中取L-1件,一是不取m,从1到m-1中取L件

return f and pickup //f(m-1,L,volume)大的话则pickup即为f(m-1,L,volume)返回的pickup,否则pickup为f(m-1,L-1,volume-vol[m])返回的pickup进行修改,把物品m标记为选取。

f(N.K,V)即为所求最大价值,返回的pickup为取法。

pascal程序应该是个function f()函数吧,主程序直接对value、vol、V等初始化,然后调用f(N,K,V)。由于函数进行了递归,在N增大时所要求的空间和时间会很大。如果用非递归的方法会稍好,可以用分支定界法剪枝,比如不取5,从1到4中选取的结果已经求出,而选取了5,不选4,现在从1到3中取,v不超过6.4,而前面算1到4时已经有了1到3,v不超过7.1的结果,这个结果加上5的价值都不如前面算的1到4的结果,更不用说v不超过6.4了,因此就不用继续计算1到3,v不超过6.4的结果了。不过这样将需要更多的变量保存中间结果,即搜索树上的中间结点,程序也将复杂化。

上面所有的讨论都没有考虑有多解的情形,如果取1、2、6和取2、4都是总体积58,总价值97,且为最优解,则上面的所有方法都只能得到其中一组解,如果要得到所有解,需要对保存取法的变量进行改动,通常建立一个索引即可。M[1]到M[V]可以作为V个指向链表的指针,如果v=28有三组解,可以用num[28]=3保存或是保存在M[28]指向的链表的头结点。上面所谓的a[m]为true或false也不用了,num[m]=0(此时M[m]指向null)或者M[m]指向的头结点是个单结点。其实无需记录解的数目,v=36的解变更时,自然会读取v=28的解的链表,从头读到尾。

⑺ 如何正确使用数据库索引

问题补充:能不能具体点,新建一个索引就可以了吗
基本上可以这么说,不过你也可以修改索引。
记住:
索引其实关键目的是为了加快检索速度而建立的,所以,怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引然后体验加上索引后的查询变快的感觉就行了。所以,索引怎么用就变为了“怎么创建合适的索引”
以下回答是否符合你的要求?你还有什么问题?
第一次回答:
一、索引是什么
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 sql Server 可以快速有效地查找与键值关联的行。
表或视图可以包含以下类型的索引:
* 聚集
o 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。
o 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
* 非聚集
o 非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
o 从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。
o 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。
聚集索引和非聚集索引都可以是唯一的。这意味着任何两行都不能有相同的索引键值。另外,索引也可以不是唯一的,即多行可以共享同一键值。
每当修改了表数据后,都会自动维护表或视图的索引。
索引和约束
对表列定义了 PRIMARY KEY 约束和 UNIQUE 约束时,会自动创建索引。例如,如果创建了表并将一个特定列标识为主键,则 数据库引擎自动对该列创建 PRIMARY KEY 约束和索引。有关详细信息,请参阅创建索引(数据库引擎)。
二、索引有什么用
与书中的索引一样,数据库中的索引使您可以快速找到表或索引视图中的特定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建设计良好的索引以支持查询,可以显着提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。索引还可以强制表中的行具有唯一性,从而确保表数据的数据完整性。
设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 SELECT、UPDATE、DELETE 或 MERGE 语句的各种查询,索引会很有用。例如,在 AdventureWorks 数据库中执行的查询 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。执行此查询时,查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。
扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表会有许多磁盘 I/O 操作,并占用大量资源。但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。
查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。
查询优化器在执行查询时通常会选择最有效的方法。但如果没有索引,则查询优化器必须扫描表。您的任务是设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。SQL Server 提供的数据库引擎优化顾问可以帮助分析数据库环境并选择适当的索引。
三、索引怎么用
索引其实关键目的是为了加快检索速度而建立的,所以,怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引然后体验加上索引后的查询变快的感觉就行了。所以,索引怎么用就变为了“怎么创建合适的索引”,以下说明这个问题:
索引设计不佳和缺少索引是提高数据库和应用程序性能的主要障碍。设计高效的索引对于获得良好的数据库和应用程序性能极为重要。为数据库及其工作负荷选择正确的索引是一项需要在查询速度与更新所需开销之间取得平衡的复杂任务。如果索引较窄,或者说索引关键字中只有很少的几列,则需要的磁盘空间和维护开销都较少。而另一方面,宽索引可覆盖更多的查询。您可能需要试验若干不同的设计,才能找到最有效的索引。可以添加、修改和删除索引而不影响数据库架构或应用程序设计。因此,应试验多个不同的索引而无需犹豫。
SQL Server 中的查询优化器可在大多数情况下可靠地选择最高效的索引。总体索引设计策略应为查询优化器提供可供选择的多个索引,并依赖查询优化器做出正确的决定。这在多种情况下可减少分析时间并获得良好的性能。若要查看查询优化器对特定查询使用的索引,请在 SQL Server Management Studio 中的“查询”菜单上选择“包括实际的执行计划”。
不要总是将索引的使用等同于良好的性能,或者将良好的性能等同于索引的高效使用。如果只要使用索引就能获得最佳性能,那查询优化器的工作就简单了。但事实上,不正确的索引选择并不能获得最佳性能。因此,查询优化器的任务是只在索引或索引组合能提高性能时才选择它,而在索引检索有碍性能时则避免使用它。
建议的索引设计策略包括以下任务:
1. 了解数据库本身的特征。例如,它是频繁修改数据的联机事务处理 (OLTP) 数据库,还是主要包含只读数据的决策支持系统 (DSS) 或数据仓库 (OLAP) 数据库?
2. 了解最常用的查询的特征。例如,了解到最常用的查询联接两个或多个表将有助于决定要使用的最佳索引类型。
3. 了解查询中使用的列的特征。例如,某个索引对于含有整数数据类型同时还是唯一的或非空的列是理想索引。筛选索引适用于具有定义完善的数据子集的列。
4. 确定哪些索引选项可在创建或维护索引时提高性能。例如,对现有某个大型表创建聚集索引将会受益于 ONLINE 索引选项。ONLINE 选项允许在创建索引或重新生成索引时继续对基础数据执行并发活动。
5. 确定索引的最佳存储位置。非聚集索引可以与基础表存储在同一个文件组中,也可以存储在不同的文件组中。索引的存储位置可通过提高磁盘 I/O 性能来提高查询性能。例如,将非聚集索引存储在表文件组所在磁盘以外的某个磁盘上的一个文件组中可以提高性能,因为可以同时读取多个磁盘。
或者,聚集索引和非聚集索引也可以使用跨越多个文件组的分区方案。在维护整个集合的完整性时,使用分区可以快速而有效地访问或管理数据子集,从而使大型表或索引更易于管理。有关详细信息,请参阅已分区表和已分区索引。在考虑分区时,应确定是否应对齐索引,即,是按实质上与表相同的方式进行分区,还是单独分区。
# 设计索引。
索引设计是一项关键任务。索引设计包括确定要使用的列,选择索引类型(例如聚集或非聚集),选择适当的索引选项,以及确定文件组或分区方案布置。
# 确定最佳的创建方法。按照以下方法创建索引:
* 使用 CREATE TABLE 或 ALTER TABLE 对列定义 PRIMARY KEY 或 UNIQUE 约束
SQL Server 数据库引擎自动创建唯一索引来强制 PRIMARY KEY 或 UNIQUE 约束的唯一性要求。默认情况下,创建的唯一聚集索引可以强制 PRIMARY KEY 约束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默认情况下,创建的唯一非聚集索引可以强制 UNIQUE 约束,除非已明确指定唯一的聚集索引且表中不存在聚集索引。
还可以指定索引选项和索引位置、文件组或分区方案。
创建为 PRIMARY KEY 或 UNIQUE 约束的一部分的索引将自动给定与约束名称相同的名称。
* 使用 CREATE INDEX 语句或 SQL Server Management Studio 对象资源管理器中的“新建索引”对话框创建独立于约束的索引
必须指定索引的名称、表以及应用该索引的列。还可以指定索引选项和索引位置、文件组或分区方案。默认情况下,如果未指定聚集或唯一选项,将创建非聚集的非唯一索引。若要创建筛选索引,请使用可选的 WHERE 子句。
# 创建索引。
要考虑的一个重要因素是对空表还是对包含数据的表创建索引。对空表创建索引在创建索引时不会对性能产生任何影响,而向表中添加数据时,会对性能产生影响。
对大型表创建索引时应仔细计划,这样才不会影响数据库性能。对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。在对现有表创建索引时,请考虑将 ONLINE 选项设置为 ON。该选项设置为 ON 时,将不持有长期表锁以继续对基础表的查询或更新。

⑻ 索引在mysql中怎么存储的

MySQL主要提供2种方式的索引:B-Tree(包括B+Tree)索引,Hash索引。
B-Tree的存储方式是平衡二叉树;
Hash索引的存储方式是构建hash表。

⑼ mysql数据库,索引是怎么使用的

MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。通常来说,可以遵循以下一些指导原则:
(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

⑽ 在数据表中索引有什么用,怎么建立索引

索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多。建立索引的操作步骤如下:

1、首先我们打开一个要操作的数据表,如下图所示,我们需要给name字段添加索引。