数据库中创建索引

数据库中创建索引,第1张

为给定表或视图创建索引

只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。语法

CREATE[UNIQUE][CLUSTERED|]INDEXindex_name

ON{table|view}(column[ASC|DESC][,n])

[WITH[,n]]

[ONfilegroup]::=

{PAD_INDEX|

FILLFACTOR=fillfactor|

IGNORE_DUP_KEY|

DROP_EXISTING|

STATISTICS_NORECOMPUTE|

SORT_IN_TEMPDB

}参数

UNIQUE为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚集索引必须是UNIQUE索引。在创建索引时,如果数据已存在,MicrosoftSQLServer会检查是否有重复值,并在每次使用INSERT或UPDATE语句添加数据时进行这种检查。如果存在重复的键值,将取消CREATEINDEX语句,并返回错误信息,给出第一个重复值。当创建UNIQUE索引时,有多个NULL值被看作副本。如果存在唯一索引,那么会产生重复键值的UPDATE或INSERT语句将回滚,SQLServer将显示错误信息。即使UPDATE或INSERT语句更改了许多行但只产生了一个重复值,也会出现这种情况。如果在有唯一索引并且指定了IGNORE_DUP_KEY子句情况下输入数据,则只有违反UNIQUE索引的行才会失败。在处理UPDATE语句时,IGNORE_DUP_KEY不起作用。SQLServer不允许为已经包含重复值的列创建唯一索引,无论是否设置了IGNORE_DUP_KEY。如果尝试这样做,SQLServer会显示错误信息;重复值必须先删除,才能为这些列创建唯一索引。CLUSTERED创建一个对象,其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的数据行。一个表或视图只允许同时有一个聚集索引。具有聚集索引的视图称为索引视图。必须先为视图创建唯一聚集索引,然后才能为该视图定义其它索引。在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。如果没有指定CLUSTERED,则创建非聚集索引。说明因为按照定义,聚集索引的叶级与其数据页相同,所以创建聚集索引时使用ONfilegroup子句实际上会将表从创建该表时所用的文件移到新的文件组中。在特定的文件组上创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。文件组的大小必须至少是整个表所需空间的12倍,这一点很重要。

下面列出:

1增加一个字段

alter

table

user

add

COLUMN

new1

VARCHAR(20)

DEFAULT

NULL;

//增加一个字段,默认为空

alter

table

user

add

COLUMN

new2

VARCHAR(20)

NOT

NULL;

//增加一个字段,默认不能为空

2删除一个字段

alter

table

user

DROP

COLUMN

new2;

//删除一个字段

3修改一个字段

alter

table

user

MODIFY

new1

VARCHAR(10);

//修改一个字段的类型

alter

table

user

CHANGE

new1

new4

int; 

//修改一个字段的名称,此时一定要重新

//主键

alter

table

tabelname

add

new_field_id

int(5)

unsigned

default

0

not

null

auto_increment

,add

primary

key

(new_field_id);

//增加一个新列

alter

table

t2

add

d

timestamp;

alter

table

infos

add

ex

tinyint

not

null

default

‘0′;

//删除列

alter

table

t2

drop

column

c;

//重命名列

alter

table

t1

change

a

b

integer;

//改变列的类型

alter

table

t1

change

b

b

bigint

not

null;

alter

table

infos

change

list

list

tinyint

not

null

default

‘0′;

//重命名表

alter

table

t1

rename

t2;

加索引

mysql>

alter

table

tablename

change

depno

depno

int(5)

not

null;

mysql>

alter

table

tablename

add

index

索引名

(字段名1[,字段名2

…]);

mysql>

alter

table

tablename

add

index

emp_name

(name);

加主关键字的索引

mysql>

alter

table

tablename

add

primary

key(id);

加唯一限制条件的索引

mysql>

alter

table

tablename

add

unique

emp_name2(cardnumber);

删除某个索引

mysql>alter

table

tablename

drop

index

emp_name;

增加字段:

mysql>

ALTER

TABLE

table_name

ADD

field_name

field_type;

修改原字段名称及类型:

mysql>

ALTER

TABLE

table_name

CHANGE

old_field_name

new_field_name

field_type;

删除字段:

mysql>

ALTER

TABLE

table_name

DROP

field_name;

mysql修改字段长度

alter

table

表名

modify

column

字段名

类型;

例如

数据库中user表

name字段是varchar(30)

可以用

alter

table

user

modify

column

name

varchar(50)

;

一、CREATE INDEX方法

CREATE INDEX <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])

限制:只能增加普通索引INDEX和UNIQUE INDEX索引这两种;不能创建PRIMARY KEY索引

二、ALTER TABLE方法

ALTER TABLE <表名> ADD INDEX [<索引名>] (<列名>,…)

ALTER TABLE <表名> ADD UNIQUE [ INDEX | KEY] [<索引名>] (<列名>,…)

ALTER TABLE <表名> ADD PRIMARY KEY (<列名>,…)

ALTER TABLE <表名> ADD FOREIGN KEY [<索引名>] (<列名>,…)

三、CREATE TABLE时候指定

创建一般索引

CREATE TABLE tb_stu_info

(

id INT NOT NULL,

name CHAR(45) DEFAULT NULL,

dept_id INT DEFAULT NULL,

age INT DEFAULT NULL,

height INT DEFAULT NULL,

INDEX(height)

);

创建唯一索引

mysql> CREATE TABLE tb_stu_info2

(

id INT NOT NULL,

name CHAR(45) DEFAULT NULL,

dept_id INT DEFAULT NULL,

age INT DEFAULT NULL,

height INT DEFAULT NULL,

UNIQUE INDEX(height)

);

创建主键(虽然ALTER TABLE也能创建,但主键一般都在创表时建立)

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

PRIMARY KEY(ID)

);

下面是关于数据库索引的相关知识:

简单来说,数据库索引就是数据库的数据结构!进一步说则是该数据结构中存储了一张表中某一列的所有值,也就是说索引是基于数据表中的某一列创建的。总而言之:一个索引是由表中某一列上的数据组成,并且这些数据存储在某个数据结构中。

2索引的作用。举个例子,假设有一张数据表Emplyee,该表有三列:

表中有几万条记录。现在要执行下面这条查询语句,查找出所有名字叫“Jesus”的员工的详细信息

3如果没有数据库索引功能,数据库系统会逐行的遍历整张表,对于每一行都要检查其Employee_Name字段是否等于“Jesus”。因为我们要查找所有名字为“Jesus”的员工,所以当我们发现了一条名字是“Jesus”的记录后,并不能停止继续查找,因为可能有其他员工也叫“Jesus”。这就意味着,对于表中的几万条记录,数据库每一条都要检查。这就是所谓的“全表扫描”( full table scan)

4而数据库索引功能索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录/行的数量。

5如何创建数据库索引。可以基于Employee表的两列创建索引即可:

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

2索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

3索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。

4例如这样一个查询:select from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

5从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持

参考资料:

数据库索引-百度百科

索引用于快速找到特定一些值的记录。如果没有索引,MySQL就必须从第一行记录开始读取整个表来检索记录。表越大,资源消耗越大。如果在字段上有索引的话,MySQL就能很快决定该从数据文件的哪个位置开始搜索记录,而无须查找所有的数据。如果表中有1000条记录的话,那么这至少比顺序地读取数据快100倍。注意,如果需要存取几乎全部1000条记录的话,那么顺序读取就更快了,因为这样会使磁盘搜索最少。

大部分MySQL索引(PRIMARY KEY, UNIQUE,INDEX 和 FULLTEXT)都是以B树方式存储。只有空间类型的字段使用R树存储,MEMORY (HEAP)表支持哈希索引。

字符串默认都是自动压缩前缀和后缀中的空格。

通常,如下所述几种情况下可以使用索引。哈希索引(用于 MEMORY 表)的独特之处在后面会讨论到。

想要尽快找到匹配 WHERE 子句的记录。

根据条件排除记录。如果有多个索引可共选择的话,MySQL通常选择能找到最少记录的那个索引。

做表连接查询时从其他表中检索记录。

想要在指定的索引字段 key_col 上找到它的 MIN() 或 MAX() 值。优化程序会在检查索引的

key_col 字段前就先检查其他索引部分是否使用了 WHERE key_part_# = constant 子句。这样的话,

MySQL会为 MIN() 或 MAX() 表达式分别单独做一次索引查找,并且将它替换成常数。当所有的表达式都被替换成常数后,查询就立刻返回。如下:

SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;

对表作排序或分组,当在一个可用的最左前缀索引上做分组或排序时(如 ORDER

BY key_part1, key_part2)。如果所有的索引部分都按照 DESC 排序,索引就按倒序排序。

有些时候,查询可以优化使得无需计算数据就能直接取得结果。当查询使用表中的一个数字型字段,且这个字段是索引的最左部分,则可能从索引树中能很快就取得结果:

SELECTkey_part3FROMtbl_nameWHEREkey_part1=1

假设有如下 SELECT 语句:

如果在 col1 和 col2 上有一个多字段索引的话,就能直接取得对应的记录了。

KEY通常是INDEX同义词。如果关键字属性PRIMARY KEY在列定义中已给定,则PRIMARY KEY也可以只指定为KEY。这么做的目的是与其它数据库系统兼容。 PRIMARY KEY是一个唯一KEY,此时,所有的关键字列必须定义为NOT NULL。如果这些列没有被明确地定义为NOT NULL,MySQL应隐含地定义这些列。一个表只有一个PRIMARY KEY。如果您没有PRIMARY KEY并且一个应用程序要求在表中使用PRIMARY KEY,则MySQL返回第一个UNIQUE索引,此索引没有作为PRIMARY KEY的NULL列

以上就是关于数据库中创建索引全部的内容,包括:数据库中创建索引、mysql数据库表修改某一列的类型、mysql创建索引的三种办法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/9828143.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存