SQL 索引详解

合集下载

sql常用函数 index

sql常用函数 index

sql常用函数index摘要:1.SQL 概述2.SQL 中的常用函数3.index 函数的使用方法4.index 函数的应用实例5.结论正文:1.SQL 概述SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的编程语言。

它可以用于查询、插入、更新和删除数据库中的数据,还可以用于创建和管理数据库表、视图和索引等。

SQL 具有丰富的功能和高度的灵活性,广泛应用于各种数据库管理系统,如MySQL、Oracle 和SQL Server 等。

2.SQL 中的常用函数在SQL 中,有许多常用函数可以帮助我们处理和分析数据。

这些函数主要包括:- 数值函数:如ABS(x)、ROUND(x)、TRUNC(x) 等,用于处理数值数据。

- 字符串函数:如LENGTH(x)、SUBSTRING(x)、INSTR(x) 等,用于处理字符串数据。

- 日期和时间函数:如CURDATE()、CURTIME()、DATE(x) 等,用于处理日期和时间数据。

- 逻辑函数:如IF()、CASE WHEN...THEN...ELSE...END 等,用于实现条件判断和逻辑运算。

- 聚合函数:如SUM()、AVG()、MAX() 等,用于对一组数据进行统计和汇总。

3.index 函数的使用方法在SQL 中,index 函数是一种用于返回指定列或表达式的索引值的函数。

它可以帮助我们快速定位和检索数据,提高查询效率。

index 函数的基本语法如下:```INDEX(column_name/expression, row_number)```其中,column_name/expression 表示需要返回索引值的列名或表达式,row_number 表示需要返回的行号。

4.index 函数的应用实例假设我们有一个名为“students”的学生信息表,表中有以下列:id、name、age、score。

sql索引用法和实例

sql索引用法和实例

sql索引用法和实例SQL索引是一种提高查询效率和性能的重要工具。

索引是数据库中的一个数据结构,用于快速定位和访问数据。

在数据库中创建索引后,系统可以更快地执行查询操作,并且可以减少查询所需的资源,从而提高系统的响应时间和吞吐量。

在使用SQL索引时,需要考虑索引的创建和使用方法。

以下是SQL索引的用法和一些实例:1. 创建索引:为了创建索引,可以使用CREATE INDEX语句。

创建索引的语法如下:```CREATE INDEX index_name ON table_name (column1, column2, ...);```其中,index_name是要创建的索引的名称,table_name是要创建索引的表的名称,column1、column2等是要创建索引的列的名称。

可以创建单列索引,也可以创建多列联合索引。

2. 查看索引:为了查看表中的索引,可以使用SHOW INDEX语句。

查看索引的语法如下:```SHOW INDEX FROM table_name;```其中,table_name是要查看索引的表的名称。

3. 删除索引:为了删除索引,可以使用DROP INDEX语句。

删除索引的语法如下:```DROP INDEX index_name ON table_name;```其中,index_name是要删除的索引的名称,table_name是索引所在的表的名称。

4. 使用索引的注意事项:在使用SQL索引时,需要注意以下几点:- 索引应该根据查询操作中经常使用的列来创建。

在选择要索引的列时,应该考虑到查询的频率和查询的效率。

- 索引可以提高查询效率,但对数据的添加、更新和删除操作会有一定的影响。

因此,需要根据实际需求来平衡索引的使用。

- 选择合适的索引类型。

常见的索引类型包括B树索引、哈希索引和全文索引。

每种索引类型都有其适用的场景和使用限制。

下面是一些使用SQL索引的实例:1. 创建单列索引:```CREATE INDEX idx_name ON employee (last_name);```这个示例在employee表的last_name列上创建了一个名为idx_name的索引。

sql常用函数 index

sql常用函数 index

sql常用函数indexSQL常用函数index在SQL中,index(索引)是一种用于加快查询速度的数据结构。

它以键值对的形式存储数据,可以提供快速的数据访问路径。

index可以使得数据库在执行查询时不必逐行扫描整个表,而是直接通过索引值定位到所需数据的位置,从而提高查询的效率。

本文将详细介绍SQL常用函数index 的相关知识。

一、什么是indexindex是一种数据结构,用于在数据库中加速数据的查找操作。

它是一个独立于表的对象,与表一同存储在数据库中。

index通过建立索引(indexing)来加速查询的过程。

索引是一种有序排列的数据结构,保存了指向表中数据的指针。

通过索引,数据库可以更快地定位到所需的数据,而不必逐行扫描整个表。

二、index的特点index在数据库中是一个独立的对象,与表一同存储在数据库中。

它的特点如下:1. 提高查询速度:index可以加速数据库的查询操作,通过指向表中数据的指针,数据库可以迅速定位到所需数据的位置,而不必逐行扫描整个表。

2. 占用额外的存储空间:index需要额外的存储空间来存储索引数据,因此会占用一定的存储资源。

但是,相比于整个表而言,index的存储空间通常较小。

3. 频繁更新会影响性能:当对表进行插入、更新或删除操作时,index也需要进行相应的更新。

如果频繁进行这些操作,index的性能可能会受到影响。

三、index的应用场景index可以在很多场景下发挥重要作用,特别是在以下几个方面:1. 提高查询速度:对于经常进行查询操作的表,通过创建index可以显著提高查询的速度。

2. 加速连接操作:当需要在多个表之间进行连接查询时,通过为连接字段建立index可以提高连接查询的效率。

3. 优化排序和分组操作:对于包含大量数据的表,通过为排序和分组字段建立index可以加快排序和分组操作的速度。

四、创建index的方法在SQL中,可以通过以下几种方法来创建index:1. 在创建表时指定index:在创建表的时候,可以为表的某个字段或多个字段指定index。

sql 索引的建立与使用

sql 索引的建立与使用

sql 索引的建立与使用SQL索引的建立与使用一、引言在数据库中,索引是一种提高查询效率的重要工具。

它可以加速数据的查找和检索过程,减少数据库的I/O操作,提高系统的响应速度。

本文将介绍SQL索引的建立与使用,包括索引的概念、建立索引的方法、索引的使用场景以及索引的优缺点。

二、索引的概念索引是一种特殊的数据结构,它通过存储列值和对应的行指针,可以快速地定位和访问目标数据。

在数据库中,索引通常是在表的某一列或多列上创建的,以提高查询操作的速度。

通过使用索引,数据库可以避免全表扫描,而是直接定位到满足查询条件的数据。

三、建立索引的方法1. 唯一索引:在列上建立唯一索引,可以确保该列的值在表中是唯一的。

在创建唯一索引时,数据库会自动检查索引列的唯一性,并在插入或更新数据时进行验证。

可以使用CREATE UNIQUE INDEX 语句来创建唯一索引。

2. 非唯一索引:在列上建立非唯一索引,可以加速查询操作。

非唯一索引允许重复的值存在,但仍然可以通过索引来快速定位数据。

可以使用CREATE INDEX语句来创建非唯一索引。

3. 聚集索引:在表中的主键列上建立聚集索引,可以按照主键的顺序物理存储数据。

聚集索引可以加速主键查询和范围查询操作,但只能在一个表上建立一个聚集索引。

4. 非聚集索引:在表的非主键列上建立非聚集索引,可以加速非主键查询操作。

非聚集索引通过存储列值和对应的行指针,可以快速定位满足查询条件的数据。

四、索引的使用场景1. 频繁的查询操作:对于经常需要进行查询操作的列,可以建立索引来加速查询速度。

例如,在一个订单表中,经常需要根据订单号进行查询,可以在订单号列上建立索引。

2. 大数据量表的查询:对于包含大量数据的表,建立索引可以显著提高查询效率。

例如,在一个用户表中,如果用户数量非常大,可以在用户名列上建立索引。

3. 关联查询:对于需要进行关联查询的表,建立索引可以加速查询操作。

例如,在一个订单表和商品表的关联查询中,可以在订单号和商品编号列上建立索引。

sql索引的原理

sql索引的原理

sql索引的原理
索引是一种数据结构,用于加快数据库中数据的检索速度。

它的原理是通过预先构建一棵树形结构(通常是B树或B+树),将数据库表中的某一列或几列的值与对应记录的物理存储位置关联起来。

这样,在进行查询时,数据库可以首先查找索引来定位到符合条件的记录所在的物理地址,从而避免全表扫描,大大提升查询效率。

索引的原理可以分为以下几个步骤:
1. 创建索引:通过某种算法,将数据库表中指定的列值按照一定的规则排序,并存储它们的物理存储位置。

2. 存储索引:索引通常存储在独立的数据结构中,而不是直接存储在数据库表中。

这样可以减小数据表的大小,提高查询的效率。

3. 查询优化:当数据库收到一个带有查询条件的查询指令时,它首先会检查是否存在适用的索引。

如果存在索引,数据库会利用索引的信息来定位到符合条件的记录的位置。

4. 加速数据访问:通过将数据存储在索引的叶子节点中,可以避免对整个数据表的扫描,从而大大减少磁盘I/O的次数,提
高数据的访问速度。

5. 更新索引:当执行对数据表的插入、更新或删除操作时,索引也需要进行相应的维护,以保持索引与数据表的一致性。

总而言之,索引通过一种类似于“目录”的方式,存储了数据库表中特定列值与对应记录位置的映射关系,以加快数据库检索的速度。

通过使用索引,可以避免全表扫描,提高查询效率,并且能够加速数据访问、优化查询操作。

sql索引原理

sql索引原理

sql索引原理SQL索引是一个用于提高数据库查询性能的关键元素。

它可以用于快速查找和排序数据库表中的数据,从而减少数据库查询的时间。

在本文中,我们将介绍SQL索引及其原理。

1. 什么是SQL索引?SQL索引是一种数据结构,用于加快数据库中表的查询速度。

它是一个指向数据行的指针,每个索引条目对应着一个表中的特定值。

对于具有大量数据的表,使用索引可以极大地加快查询速度,因为索引可以让数据库跳过不需要的行,只处理需要的数据。

2. SQL索引的类型SQL索引可以分为唯一索引和非唯一索引。

唯一索引的值是唯一的,不会出现重复。

而非唯一索引的值可以重复出现。

此外,还有聚集索引和非聚集索引。

聚集索引是按照索引顺序将行存储在硬盘上的,而非聚集索引则没有固定的顺序。

3. SQL索引的原理SQL索引的原理是使用B-树算法,这是一种平衡树结构,每个节点最多包含k个子节点,其中k是固定的。

B-树是一种多叉树,它的节点可以包含多个子节点。

对于一个B-树,根节点是整个树的起点,包含所有其他节点的指针。

B-树的叶子节点存储实际的索引值和指向对应行的指针。

中间节点存储索引值和指针,它们用于查找叶子节点。

每个节点的指针都指向相邻的节点,这样就可以快速地在树中移动。

当查询一个带有索引的表时,数据库首先查找索引,找到要查询的数据。

如果表中包含大量数据,使用索引可以减少查询时间。

但是,如果索引散布不均或有很多不需要的结果,则使用索引可能会降低性能。

4. SQL索引的使用建议为保证SQL索引的最佳使用效果,应该按照以下几个原则进行使用:- 在需要频繁查询的列上创建索引。

- 对于唯一性要求高的列,应该使用唯一索引。

- 对于大量重复值的列,应该使用非唯一索引。

- 对于经常需要排序的列,应该使用聚集索引。

- 对于经常需要联合查询的列,应该使用复合索引。

总的来说,SQL索引的原理是使用B-树算法,通过跳过不需要的行,快速查找和排序数据库中的数据。

sqlserver索引查找、扫描、书签的概念

sqlserver索引查找、扫描、书签的概念SQL Server索引是数据库中用于加速查询的数据结构。

了解索引的查找、扫描和书签的概念对于优化查询性能至关重要。

1. 索引查找索引查找是指使用索引来快速定位到表中的特定数据行。

当查询条件中包含索引列时,SQL Server会利用索引来快速定位满足条件的行,从而减少需要扫描的数据量。

索引查找通常比全表扫描更高效,特别是对于大型表。

2. 索引扫描索引扫描是指对整个索引进行遍历以查找满足查询条件的行。

当查询条件不局限于单个列时,或者当索引包含查询所需的多个列时,SQL Server可能需要扫描整个索引来找到所需的数据。

索引扫描通常比全表扫描更快,因为它只需扫描索引而不是整个表。

3. 书签(Bookmark)查找书签查找是指使用主键或唯一索引值作为“书签”,然后在表中快速定位到相应的行。

当查询条件包含非唯一索引列时,SQL Server可能会使用书签查找来定位行。

通过使用书签,SQL Server可以在表中快速定位到指定的行,而不是扫描整个表或索引。

示例假设有一个名为“Employees”的表,其中包含“EmployeeID”、“FirstName”、“LastName”和“Department”等列。

* 如果查询条件是“查找Department为‘Sales’的员工”,并且“Department”列有索引,则SQL Server可能会使用索引查找来快速定位满足条件的行。

* 如果查询条件是“查找FirstName为‘John’且LastName为‘Doe’的员工”,并且这些列上都有索引,则SQL Server可能会使用书签查找,先在“FirstName”索引中找到符合条件的书签值,然后在“LastName”索引中利用该书签值快速找到对应的行。

优化查询性能时,了解和利用索引的这些概念非常重要。

合理设计和管理索引可以显著提高查询速度,减少数据库的负载。

聚集索引与非聚集索引详解

SQL中、聚集索引和非聚集索引有何区别?聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。

聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。

建议使用聚集索引的场合为: a.此列包含有限数目的不同值; b.查询的结果返回一个区间的值;c.查询的结果返回某值相同的大量结果集。

非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。

非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。

建议使用非聚集索引的场合为: a.此列包含了大量数目不同的值; b.查询的结束返回的是少量的结果集; c.order by 子句中使用了该列。

聚集索引:表中存储的数据按照索引的顺序存储,检索效率比普通索引高,但对数据新增/修改/删除的影响比较大非聚集索引:不影响表中的数据存储顺序,检索效率比聚集索引低,对数据新增/修改/删除的影响很少主要是存储的顺序的调整不同。

这样对一些操作的影响不同。

有利就有弊,两个之间属于对立和弥补的关系。

主要看你需要怎样的应用了。

聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致一个表只能有一个聚集索引非聚集索引是完全独立与数据行的结构,表中的数据行不按非聚集键的次序存储,存储数据过程中不会影响数据表中记录的实际存储顺序每个表可以创建249个非聚集索引1 对于经常更新的列不宜建立聚集索引2 具有高百分比的唯一值和不经常被修改的属性上创建聚集索引例如:主键3 若在一个表中既要创建聚集索引,又要创建非聚集索引,应先创建聚集索引,然后创建非聚集索引SQL Server创建索引什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。

sql索引的建立与使用

sql索引的建立与使用
MySQL索引的建立与使用
MySQL索引是一种用于提高检索速度的工具,提供迅速访问数据
库表中数据的方法。

它是把表中一列或者多列的值作为索引,同时保
存数据表行的地址。

MySQL索引有助于提高检索速度,但可能导致插入,更新和删除操作变慢。

此外,当查询表中大量数据时,索引也能够有
效减少查询时间。

MySQL索引必须使用强类型,即每个值必须是同一类型。

MySQL
索引也可以建立在Text或Blob字段上,但最近访问的字段将被视为
更重要的索引。

MySQL索引的索引类型包括唯一索引,全文索引,复合索引,前缀索引和空索引。

要创建索引,用户首先要知道哪些字段比较重要并且频繁的使用到,这样可以减少查询的时间。

然后在这些字段上添加索引,以节省
查询时间,有助于提高性能。

此外,要小心创建索引。

如果列上创建
了过多的索引,它会影响插入,更新和删除操作的性能。

因此,MySQL索引的建立和使用非常重要,它可以有效减少查询
时间,但要慎重选择要创建的索引和其索引类型。

只有在理解索引索
引以及其各种类型之后,您才能有效地使用它们来实现更低的查询时间,更快速和更有效率的操作。

sqlserver索引名规则

一、概述随着互联网和大数据时代的到来,数据库系统的重要性日益凸显。

在数据库系统中,索引是一种非常重要的性能调优手段,可以大幅提升数据库的查询速度,减少资源的消耗。

而对于SQL Server这样的关系型数据库管理系统来说,索引的设计和命名规则就显得尤为重要。

本文将就SQL Server索引的命名规则进行探讨,以期帮助读者更好地理解和使用索引。

二、索引的作用索引是一种特殊的数据库对象,它能够大幅加快数据库的查询速度。

通俗来讲,索引就像是一本书的目录,可以帮助数据库更快地找到需要的数据。

当数据库表中的数据量非常大时,没有索引的情况下查询可能会耗费大量的时间和资源。

而使用了索引之后,数据库可以迅速地定位到需要的数据,从而大幅提升了查询的效率。

三、SQL Server索引的规则在SQL Server中,索引的设计和命名规则对于数据库的性能和维护都至关重要。

以下是SQL Server索引名的命名规则:1. 索引名应当简明扼要:索引名应当能够清晰地反映出索引所在的表和列,能够清晰地表达索引的作用和含义。

一个针对“用户表”中“用户ID”列的唯一主键索引,可以命名为“PK_User_UserID”。

2. 索引名要避免使用保留字和特殊符号:索引名不应当使用SQL Server的保留字或者特殊符号,这样可以避免引发一些不必要的问题和混淆。

3. 索引名要使用规范的命名约定:在团队协作开发和维护数据库时,使用规范的命名约定可以使得索引名更易于理解和维护。

可以统一使用“IX_”作为索引名的前缀,以表示这是一个普通的非聚集索引。

4. 唯一性约束的索引名应当以“IX_Unique”开头:唯一性约束的索引名应当以“IX_Unique”开头,以表示这是一个唯一性约束。

5. 聚集索引名应当以“IX_Clustered”开头:聚集索引是数据库表中数据物理顺序的索引,聚集索引名应当以“IX_Clustered”开头,以表示这是一个聚集索引。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL 索引详解什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。

为了加快查找的速度,汉语字(词)典一般都有按拼音、笔画、偏旁部首等排序的目录(索引),我们可以选择按拼音或笔画查找方式,快速查找到需要的字(词)。

同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度。

• SQL Server中的数据也是按页( 4KB )存放•索引:是SQL Server编排数据的内部方法。

它为SQL Server提供一种方法来编排查询数据。

•索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。

•索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。

索引类型•唯一索引:唯一索引不允许两行具有相同的索引值•主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。

主键索引要求主键中的每个值是唯一的,并且不能为空•聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个•非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。

数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。

可以有多个,小于249个索引类型:再次用汉语字典打比方,希望大家能够明白聚集索引和非聚集索引这两个概念。

唯一索引:唯一索引不允许两行具有相同的索引值。

如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。

当新数据将使表中的键值重复时,数据库也拒绝接受此数据。

例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。

提示:创建了唯一约束,将自动创建唯一索引。

尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束。

主键索引:在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。

主键索引要求主键中的每个值是唯一的。

当在查询中使用主键索引时,它还允许快速访问数据。

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

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

例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。

拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。

默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。

即拼音顺序较后的字(词)对应的页码也较大。

如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。

非聚集索引(Non-clustered)如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。

聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。

例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。

提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。

设置某列为主键,该列就默认为聚集索引如何创建索引使用T-SQL语句创建索引的语法:CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]INDEX index_nameON table_name (column_name…)[WITH FILLFACTOR=x]q UNIQUE表示唯一索引,可选q CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选q FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比在stuMarks表的writtenExam列创建索引:USE stuDBGOIF EXISTS (SELECT name FROM sysindexesWHERE name = 'IX_writtenExam')DROP INDEX stuMarks.IX_writtenExam/*--笔试列创建非聚集索引:填充因子为30%--*/CREATE NONCLUSTERED INDEX IX_writtenExamON stuMarks(writtenExam)WITH FILLFACTOR= 30GO/*-----指定按索引 IX_writtenExam 查询----*/SELECT * FROM stuMarks (INDEX=IX_writtenExam)WHERE writtenExam BETWEEN 60 AND 90虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。

SQL Server将会根据我们创建的索引,自动优化查询。

索引的优缺点•优点–加快访问速度–加强行的唯一性•缺点–带索引的表在数据库中需要更多的存储空间–操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新创建索引的指导原则•请按照下列标准选择建立索引的列。

–该列用于频繁搜索–该列用于对数据进行排序•请不要使用下面的列创建索引:–列中仅包含几个不同的值。

–表中仅包含几行。

为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。

笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。

在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结: 为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。

测试环境--主机:HP LH II主频:330MHZ内存:128兆操作系统:Operserver5.0.4数据库:Sybase11.0.3一、不合理的索引设计例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情况:1.在date上建有一非个群集索引select count(*) from record where date >'19991201' and date < '19991214'and amount >2000 (25秒)select date,sum(amount) from record group by date(55秒)select count(*) from record where date >'19990901' and place in ('BJ','SH') (27秒)分析:date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。

2.在date上的一个群集索引select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 (14秒)select date,sum(amount) from record group by date(28秒)select count(*) from record where date >'19990901' and place in ('BJ','SH')(14秒)分析:在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

3.在place,date,amount上的组合索引select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 (26秒)select date,sum(amount) from record group by date(27秒)select count(*) from record where date >'19990901' and place in ('BJ', 'SH')(< 1秒)分析:这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用pl ace,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。

4.在date,place,amount上的组合索引select count(*) from record where date >'19991201' and date < '19991214' and amount >2000(< 1秒)select date,sum(amount) from record group by date(11秒)select count(*) from record where date >'19990901' and place in ('BJ','SH')(< 1秒)分析:这是一个合理的组合索引。

它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。

5.总结:缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。

一般来说:①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

二、不充份的连接条件:例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:select sum(a.amount) from account a,card b where a.card_no = b.card_no(20秒)将SQL改为:select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no(< 1秒)分析:在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card 上的索引,其I/O次数可由以下公式估算为:外层表account上的22541页+(外层表accoun t的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O 在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用acco unt上的索引,其I/O次数可由以下公式估算为:外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行。

相关文档
最新文档