数据库的索引问题

数据库的索引问题,第1张

(一) 索引类似字典以及书籍的目录,索引的作用就是加快检索数据的速度,提高效率,

索引分类为:

逻辑上:

Single column 单列索引

Concatenated 多列索引

Unique 唯一索引

NonUnique 非唯一索引

Function-based函数索引

Domain 域索引

物理上:

Partitioned 分区索引

NonPartitioned 非分区索引

B-tree:

Normal 正常型B树

Rever Key 反转型B树

Bitmap 位图索引

(二) 聚集索引和非聚集索引有什么区别?

例如由于字典是按照拼音的顺序来实际存储的,因此对拼音的索引是聚集索引,

也可以建立对笔画等的索引,由于实际存储并不是按照笔画的顺序来存储的,

因此对笔画的索引是非聚集索引,

(三)简述分区表和分区索引的优点:应该是利用不同的分区可以使得检索数据并行,进一步提高速度。

A正确 在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。

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

C正确 一个表只能包含一个聚集索引。

D错误 三列都查了,复合索引里只有两列。我认为要么只加一个单列索引address,要么就三列一起做复合索引。

索引是为检索而存在的。如一些书籍的末尾就专门附有索引,指明了某个关键字在正文中的出现的页码位置,方便我们查找,但大多数的书籍只有目录,目录不是索引,只是书中内容的排序,并不提供真正的检索功能。可见建立索引要单独占用空间;索引也并不是必须要建立的,它们只是为更好、更快的检索和定位关键字而存在。

再进一步说,我们要在图书馆中查阅图书,该怎么办呢?图书馆的前台有很多叫做索引卡片柜的小柜子,里面分了若干的类别供我们检索图书,比如你可以用书名的笔画顺序或者拼音顺序作为查找的依据,你还可以从作者名的笔画顺序或拼音顺序去查询想要的图书,反正有许多检索方式,但有一点很明白,书库中的书并没有按照这些卡片柜中的顺序排列——虽然理论上可以这样做,事实上,所有图书的脊背上都人工的粘贴了一个特定的编号①,它们是以这个顺序在排列。索引卡片中并没有指明这本书摆放在书库中的第几个书架的第几本,仅仅指明了这个特定的编号。管理员则根据这一编号将请求的图书返回到读者手中。这是很形象的例子,以下的讲解将会反复用到它。

数据库索引是一种专用数据结构,允许我们快速定位信息。它的组织方式类似于二叉树结构,左侧值较小,右侧值较大。索引可以比较树状结构中的行值,以更快地定位所需数据,而不是强制扫描整个表。

当我们在一个或多个列上创建索引时,我们将它们的值存储在新结构中,还存储指行的指针。这行为会重新组织并排序信息,但不会改变信息本身。可以将数据库索引视为书后面的索引。虽然它存储了一些实际信息,但它还包含指针,指针指向可以找到更多详细信息的位置。

按照我们的搜索条件对数据进行排序后,查找所需的记录会变得更加简单。想象一下按字母顺序排序的旧电话簿。知道某人的姓氏,名字和地址意味着您可以很快找到他们的电话号码。但是如果你只知道别人的地址和名字怎么办?没有姓氏,找到电话号码将非常困难。您可以使用反向电话簿做得更好,该目录列出了基于地址的电话号码。

在数据库中,更改搜索条件通常意味着为属性组合创建新索引。如前所述,添加这些索引需要额外的磁盘空间。添加,删除或更新值时,还会对索引进行更改。

查询条件中用到的字段才会走索引。 如果select from stu where name = "test"; 这个就走索引了。当你表里有百万 千万数据的时候,走索引的算法差不多是ln(O)

第二次回答:

问题补充:能不能具体点,新建一个索引就可以了吗

基本上可以这么说,不过你也可以修改索引。

记住:

索引其实关键目的是为了加快检索速度而建立的,所以,怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引然后体验加上索引后的查询变快的感觉就行了。所以,索引怎么用就变为了“怎么创建合适的索引”

以下回答是否符合你的要求?你还有什么问题?

第一次回答:

一、索引是什么

索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(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 HumanResourcesEmployee 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 时,将不持有长期表锁以继续对基础表的查询或更新。

简单的创建索引,可采用如下语句:

CREATE INDEX IX_ProductVendor_VendorID

ON PurchasingProductVendor (VendorID, VendorName);

GO

一、不定项选择题(共40题,每小题25分,总分100分)

1 数据库管理系统的发展历经了如下那些模型阶段( ACDE )

A 层次模型 B 结构模型 C 关系模型

D 网状模型 E对象模型

2 关系型数据库的核心单元是( B )

A 对象 B 表

C 行 D 列

3 对于关系型数据库来说,表之间存在下面那些关系( ABC )

A 一对一关系 B 一对多关系

C 多对多关系 D 继承关系

4 在SQL中,下面对于数据定义语言(DDL)描述正确的是( D )。

A DDL关心的是数据库中的数据 B 完成数据的增、删、改、查 *** 作

C 控制对数据库的访问 D 定义数据库的结构

5 MySQL是一种( C )数据库管理系统。

A 层次型 B 网络型 C 关系型 D 对象型

6 SQL中,下列 *** 作有语法错误的是( B )

A AGE IS NOT NULL B NOT(AGE IS NULL)

C SNAME=‘王五’ D SNAME=‘王%’

7 SQL中,下列关于创建、管理数据库的 *** 作语句不正确的是( CDE )

A CREATE DATABASE Instant B USE Instant C NEW DATABASE Instant

D Connection Instant E Delete DATEBASE Instant

8 在MySQL中,不存在的数据类型是( F )。

A INT B TEXT C DECIMAL

D VARCHAR E DATETIME F VARCHAR2

9 在MySQL中,下列关于创建数据库表的描述正确的是( C )。

A 在创建表时必须设定列的约束

B 在删除表的时候通过外键约束连接在一起的表会被一同删除

C 在创建表时必须设置列类型

D 通过CREATE TABLE new_t SELECT FROM old_t复制表的同时,表的约束能够一起被复制到新表中

10 根据数据完整性实施的方法,可以将其分为( ACDF )

A 实体完整性 B 表完整性 C域完整性

D 引用完整性 E 记录完整性 F用户自定义完整性

11 下面关于域完整性的方法,不正确的是( A )。

A 主键约束 B 外键约束 C检查约束

D 非空约束 E 默认值

12 下面关于创建和管理索引正确的描述是( C )。

A 创建索引是为了便于全表扫描

B 索引会加快DELETE、UPDATE和INSERT语句的执行速度

C 索引被用于快速找到想要的记录

D 大量使用索引可以提高数据库的整体性能

13 SQL中,“AGE IN(20,22)”的语义是( D )。

A AGE<=22 AND AGE >=20 B AGE <22 AND AGE >20

C AGE =20 AND AGE =22 D AGE =20 OR AGE =22

14 有一个关系:学生(学号,姓名,系别),规定学号的值域是8个数字组成的字符串,这一规则属于( C )

A 实体完整性约束 B 参照完整性约束

C 用户自定义完整性约束 D 关键字完整性约束

15 下面SQL是来源于考试成绩表t_exam:学号stuId、科目编号subId、成绩score,考试日期:ex_date。有以下sql,它表示的意思是:( B )

Select stu_id,subId,count() as x

From t_exam

Where ex_date=’2008-08-08’

Group stu_id,subId

Having count()>1

Order by x desc

A 找出’2008-08-08’这天某科考试2次及以上的学生记录

B 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数多的放在前面

C 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数少的放在前面

D 根据学号和学科分组,找出每个人考试科数,最后考试次数多的放在前面

16 EMP表如下所示,下面哪些SQL语句的返回值为3:( BD )

EMP

雇员号 雇员名 部门号 工资 

001  张山  02 2000

010  王宏达 01 1200

056  马林生 02 1000

101  赵敏 04

A select count() from emp

B select count(distinct 部门号) from emp

C select count() from emp group by 雇员号

D select count(工资) from emp

17 下面那一项不是SELECT语句对数据的 *** 作:( D )

A 投影 B 联接 C 并 D 级联

18 下面关于SQL数据查询 *** 作描述正确的有:( ABD )

A 投影 *** 作是选择对表中的哪些列进行查询 *** 作

B 使用DISTINCT关键字可以过滤查询中重复的记录

C 在模糊查询中,通配符“%”表示匹配单个字符,而“_”表示匹配零个或多个字符

D 在MySQL中使用LIMIT关键字限制从数据库中返回记录的行数

19 在SQL语言中,条件“BETWEEN 20 AND 30”表示年龄在20到30之间,且( A )。

A 包括20岁和30岁 B 不包括20岁和30岁

C 包括20岁,不包括30岁 D 不包括20岁,包括30岁

20 SQL语言中,删除EMP表中全部数据的命令正确的是( C )。

A delete from emp B drop table emp

C truncate table emp D 没有正确答案

21 有关索引的说法错误的是( AD )

A 索引的目的是为增加数据 *** 作的速度

B 索引是数据库内部使用的对象

C 索引建立得太多,会降低数据增加删除修改速度

D 只能为一个字段建立索引

22 下列哪个关键字在Select语句中表示所有列( A )

A B ALL C DESC D DISTINCT

23 在表中设置外键实现的是哪一类数据完整性( B )

A 实体完整性 B 引用完整性

C 用户定义的完整性 D 实体完整性、引用完整性和用户定义的完整性

24 下面正确表示Employees表中有多少非NULL的Region列的SQL语句是( B )

A SELECT count( ) from Employees

B SELECT count(ALL Region) from Employees

C SELECT count(Distinct Region) from Employees

D SELECT sum(ALL Region) from Employees

25 下面可以通过聚合函数的结果来过滤查询结果集的SQL子句是( C )

A WHERE子句 B GROUP BY子句

C HAVING 子句 D ORDER BY子句

26 t_score(stu_id,sub_id,score),即成绩表(学号,科目编号,成绩)。学生如果某科没有考试,则该科成绩录入null。能够获取各位学生的平均成绩的选项是( A )

A select avg(nvl(socre,0)) from score group by stu_id

B select stu_id,avg(sorce) from score

C select stu_id,avg(score) from score

D select stu_id,sum(score)/count(score) from score

27 若要求查找S表中,姓名的第一个字为'王'的学生学号和姓名。下面列出的SQL语句中,哪个是正确的( B )

A SELECT Sno,SNAME FROM S WHERE SNAME=′王%′

B SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王%′

C SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王_′

D 全部

28 若要求“查询选修了3门以上课程的学生的学生号”,正确的SQL语句是( B )

A SELECT Sno FROM SC GROUP BY Sno WHERE COUNT()> 3

B SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT()> 3)

C SELECT Sno FROM SC ORDER BY Sno WHERE COUNT()> 3

D SELECT Sno FROM SC ORDER BY Sno HAVING COUNT()>= 3

29 对下面的查询语句描述正确的是( D )

Select StudentID,Name,

(select count() from StudentExam

where StudentExamStudentID = StudentStudentID) as ExamsTaken

from Student

order by ExamsTaken desc

A 从Student表中查找StudentID和Name,并按照升序排列

B 从Student表中查找StudentID和Name,并按照降序排列

C 从Student表中查找StudentID、Name和考试次数

D 从Student表中查找StudentID、Name,并从StudentExam表中查找与StudentID一致的学生考试次数,并按照降序排列

30 下面题基于学生-课程数据库中的三个基本表:

学生信息表:s(sno, sname, sex, age, dept) 主键为sno

课程信息表:c(cno, cname, teacher) 主键为cno

学生选课信息表:sc(sno, cno, grade) 主键为(sno, cno)

“从学生选课信息表中找出无成绩的学生信息”的SQL语句是( C d )

A

SELECT FROM sc WHERE grade=NULL

B

SELECT FROM sc WHERE grade IS ‘ ’

C

SELECT FROM sc WHERE grade IS NULL

D

SELECT FROM sc WHERE grade =‘ ’

31 当子查询返回多行时,可以采用的解决办法是( C )。

A 使用聚合函数 B Where条件判断

C 使用IN运算符 D 使用Group by进行分组

32 下面关于在子查询中使用运算符描述不正确的是( D )。

A 使用IN运算符用于查找字段值属于某一组值的行

B 使用Exists运算符用于测试子查询是否返回行,如果返回其值就为真

C 使用ALL运算符用于测试子查询结果集的所有行是否满足指定的条件

D 使用Any运算符用于测试子查询结果集中的一行或多行不满足指定的条件

33 下面关于组合查询描述不正确的是( D )。

A 从一个表中获取的数据必须和其它表中的数据具有相同的列数

B 两个表中相对应的列必须具有相同的数据类型

C UNION的结果集列名与第一个SELECT语句的结果集中的列名相同

D UNION的结果集列名与第二个SELECT语句的结果集中的列名相同

E UNION ALL运算符返回每个数据集的所有成员

34 下面关于联接的描述正确的是( A )。

A 内联接使用比较运算符根据每个表共有的列值来匹配两个表中的行

B 左外联接结果集包含从右边的表返回的所有行

C 右外联接结果集包含从左边的表返回的所有行

D 全外联接返回左表和右表中的所有匹配的行

35 下面关于数据库设计过程正确的顺序描述是( C )。

A 需求收集和分析、逻辑设计、物理设计、概念设计

B 概念设计、需求收集和分析、逻辑设计、物理设计

C 需求收集和分析、概念设计、逻辑设计、物理设计

D 需求收集和分析、概念设计、物理设计、逻辑设计

36 ER图属于下面哪一种数据库设计模型( B )。

A 物理数据模型

B 概念数据模型

C 逻辑数据模型

D 需求模型

37 非主键必须完全依赖于主键列,这属于下列范式的内容( BC )

A 1NF B 2NF C 3NF D 都没有的

38 如果一个字段的数据必须来源另一个表的主键,那么要在这个字段上建立( B )。

A PK(主键) B FK(外键) C UK(唯一键) D 复合主键

39 根据三个范式的定义,下面哪个选项的设计是正确的( C )

职工编号 姓名 工种 车间 车间主任

1001 李宁 车工 一车间 周杰

1002 王海 铣工 一车间 周杰

1003 赵亮 钳工 二车间 吴明

1001 李宁 钳工 二车间 吴明

A 员工表、工种表、车间表

B 员工表、工种表、车间表、车间主任表

C 员工表、工种表、车间表、员工工种表、员工车间表

D 以上设计均不正确

40 下列说法中,哪些是正确的( BD )

A RDBMS是数据库管理系统的简称

B 各行记录都不能重复,是第二范式要求的

C 在数据库设计中一定要满足第三范式

D 索引越多,查询越快,数据更新越慢

以上就是关于数据库的索引问题全部的内容,包括:数据库的索引问题、13. 为了加快数据库查找的速度,需要对数据表添加索引,请问以下关于索引的描述,哪些是错误的() 为什么、数据库中 索引的定义 是什么~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9667394.html

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

发表评论

登录后才能评论

评论列表(0条)

保存