`
yefeng_laixi
  • 浏览: 16284 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]你真的了解SQL的索引吗?

 
阅读更多

你真的了解SQL的索引吗(聚集索引篇)

2010-12-17

其实对于非专业的数据库操作人员来讲,例如软件开发人员,在很大程度上都搞不清楚数据库索引的一些基本知识,有些是知其一不知其二,或者是知其然不知其所以然。造成这种情况的主要原因我觉的是行业原因,有很多公司都有自己的DBA团队,他们会帮助你优化SQL,开发人员即使不懂优化问题也不大,所以开发人员对这方面也就不会下太多功夫去了解SQL优化,但如果公司没有这样的DBA呢,就只能靠程序员自己了。 最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别。

大家可能认为这个问题难度不大,认为太熟悉了,也许不会感兴趣,但你真能说清楚吗?其实要想说明白这两者的差别也不是三两句就说的清的,那天我也是觉的这问题太泛了,就随便说了其中的两个区别:

  1. 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,这个跟没问题没差别,一般人都知道。
  2. 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续,这个大家也都知道。

上面的两点从大的方面讲都是讲的通的,后面我们继续探讨,举一个实际点的例子,一个学生表student,里面是学生号id,学生姓名,学生所在城市ID,学生成绩(总分)。

  • 问:如果想按姓名查询,如何做优化?
  • 答:在姓名字段上建立索引。
  • 问:建立什么类型的索引?
  • 答:建立非聚集索引。
  • 问:为什么?
  • 答:一般有范围查询的需求,可以考虑在此字段上创建聚集索引。
  • 问:学分有重复性,在学分字段上创建聚集索引能行吗? ....沉思,不能创建吗?之前的项目好像真这样做过
  • 答:应该可以吧。
  • 问:聚集索引的约束是什么?
  • 答:唯一性啊?
  • 问:既然是唯一性,那么学分字段上还能创建聚集索引吗?....再次沉思,应该可以啊,但索引的约束又怎么说呢?
  • 答:应该可以的,以前用过。

我自认为是对数据库索引知识有一定研究的,但可能是有两年没实际接触SQL的原因,一时还真想不出具有说服力的解释,朋友们看到这能解答我的问题吗?

其实上面的我们需要搞清楚以下几个问题:

第一:聚集索引的约束是唯一性,是否要求字段也是唯一的呢?

分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,SQL会默认在此字段上创建一个聚集索引,而主键都是唯一的,所以理所当然的认为创建聚集索引的字段也需要唯一。

结论:聚集索引可以创建在任何一列你想创建的字段上,这是从理论上讲,实际情况并不能随便指定,否则在性能上会是恶梦。

第二:为什么聚集索引可以创建在任何一列上,如果此表没有主键约束,即有可能存在重复行数据呢?

粗一看,这还真是和聚集索引的约束相背,但实际情况真可以创建聚集索引,分析其原因是:如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

第三:是不是聚集索引就一定要比非聚集索引性能优呢?

如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?

答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。

第四:在数据库中通过什么描述聚集索引与非聚集索引的?

索引是通过二叉树的形式进行描述的,我们可以这样区分聚集与非聚集索引的区别:聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。

第五:在主键是创建聚集索引的表在数据插入上为什么比主键上创建非聚集索引表速度要慢?

有了上面第四点的认识,我们分析这个问题就有把握了,在有主键的表中插入数据行,由于有主键唯一性的约束,所以需要保证插入的数据没有重复。我们来比较下主键为聚集索引和非聚集索引的查找情况:聚集索引由于索引叶节点就是数据页,所以如果想检查主键的唯一性,需要遍历所有数据节点才行,但非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性,只需要遍历所有的索引页就行,这比遍历所有数据行减少了不少IO消耗。这就是为什么主键上创建非聚集索引比主键上创建聚集索引在插入数据时要快的真正原因。

好了,讲这这些,不知道大家是否真的了解SQL的聚焦索引,我也是数据库新手(从使用时间上来讲也不算新了,哈哈),不专业,有什么不对的地方,希望大家批评指正,下篇我会分析一些数据库访问索引的情况,有图的情况下,也许看的更加明白。

 

转载于http://www.nowamagic.net/database/db_ClusteredIndex.php

分享到:
评论

相关推荐

    SqlServer索引工作原理

    在了解SqlServer索引工作原理之前,我们需要了解什么是索引。索引是一种特殊的数据库结构,它可以快速地定位和检索数据。索引的作用是加快数据的查询速度,使得数据库中的数据更易于管理和维护。 SqlServer索引工作...

    sql server创建索引

    本文将深入探讨如何在SQL Server中创建索引,包括理解不同类型的索引、索引的创建语法以及如何利用索引提升数据库性能。 ### 一、索引类型 在SQL Server中,主要存在两种类型的索引:聚集索引(Clustered Index)...

    76当我们在SQL里进行分组的时候,如何才能使用索引?.pdf

    尤其是在使用SQL语句进行数据分组(GROUP BY)时,索引的使用变得尤其重要。本文将深入探讨在使用GROUP BY语句时如何有效利用索引,以及与之相关的一些其他数据库性能优化概念。 首先,GROUP BY语句在数据库中用于...

    oracle、sql数据库批量建索引

    首先,让我们了解索引的基本概念。索引是数据库为了快速定位数据而创建的一种数据结构,类似于书籍的目录。它减少了数据库执行查询时扫描整个表的次数,从而显著提高了查询速度。在数据量庞大的情况下,索引的重要性...

    ORACLE索引详解及SQL优化

    本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,我们要理解索引的基本概念。在数据库中,索引类似于书籍的目录,它为数据提供快速访问的途径。...

    SQL Server 索引结构及其使用

    尤其在使用SQL Server数据库时,了解并合理利用其索引结构能够显著提升数据检索效率。本文将详细探讨SQL Server中的索引结构以及如何恰当地使用它们。 首先,索引在SQL Server中分为两大类:聚集索引和非聚集索引。...

    SQL Server 索引基础知识

    ### SQL Server 索引基础知识知识点汇总 #### 一、记录数据的基本格式 - **数据页作为基础单位**:在 SQL Server ...以上是 SQL Server 索引基础知识的核心知识点汇总,希望对你理解和应用 SQL Server 索引有所帮助。

    SQL Server 全文索引查询

    首先,要启用SQL Server的全文索引查询,你需要确保你的SQL Server实例支持全文搜索服务。这通常需要在安装SQL Server时选择并添加此功能。如果你已经安装了SQL Server但未包含全文搜索,可以通过重新安装或添加功能...

    数据库面试题索引sql优化

    ### 数据库面试题索引SQL优化 ...通过以上的分析和讨论,我们不仅深入了解了数据库面试中常见的SQL优化和索引相关的问题,还学习了一些实用的优化技巧。这些知识点对于提高数据库应用的性能至关重要。

    详解SQL Server表和索引存储结构

    ### 详解SQL Server表和索引存储结构 #### 一、引言 SQL Server作为一款广泛使用的数据库管理系统,其内部的存储结构对于优化查询性能、提高数据管理效率至关重要。本文将详细探讨SQL Server中表和索引的存储原理...

    查询索引SQL实践精华

    #### 一、理解SQL索引的重要性 在数据库管理与优化的过程中,索引扮演着至关重要的角色。一个设计良好的索引能够显著提高查询性能,减少查询时间,对于处理大量数据的应用尤其重要。本文将通过实战案例来深入探讨...

    sqlserver 2008 查找缺失索引

    通过查询这些缺失索引信息,DBA(数据库管理员)可以更好地了解哪些索引可能有助于提高特定查询的性能。 ##### 缺失索引的查询方法 SQL Server 2008提供了动态管理视图(Dynamic Management Views, DMVs)来查询...

    SQL语句索引优化_sql索引降龙十八掌(Oracle)

    让我们一起领略"SQL索引降龙十八掌"的精髓。 一、了解索引 1. 索引类型: - B树索引:最常见的索引类型,适用于等值查询。 - bitmap索引:适用于多列组合查询和数据仓库场景。 - 全文索引:用于全文搜索。 - ...

    SQL Server的全文索引及优化.pdf

    全文索引和查询的优化,需要数据库管理员深入了解其工作原理和索引策略,合理配置索引参数和使用全文搜索的高级功能。正确配置全文索引对于实现数据库的高吞吐量和最佳性能至关重要。在实际应用中,数据库管理员应...

    05++sql索引

    SQL索引是数据库管理系统中的重要组成部分,它对提高查询效率起着至关重要的作用。在数据库中,特别是处理大规模数据时,如果没有索引,查询过程可能会非常慢,因为系统需要逐行扫描整个表来找到匹配的记录。而索引...

    SQL经典教程与索引与优化设计

    如果你想极大提高SQL Server 性能,本篇指南中提到的索引将是您最佳选择...在本文指南中你将了解如何设计最佳 SQL Server 索引、如何调整 SQL Server 索引等一系 列内容,让你现存的 SQL Server 索引能够发挥最佳效能。

    Lucene结合Sql建立索引Demo源码.rar

    Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能. Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,...

    索引、视图、标准SQL测试方法

    总的来说,了解和掌握GBase8s中的索引类型、视图创建以及标准SQL测试方法,对于提升数据库性能和保证数据完整性至关重要。通过不断的测试和实践,数据库管理员和开发人员可以更好地优化数据库架构,满足各种复杂的...

    SQLServer索引对查询条件的影响

    ### SQL Server索引对查询条件的影响 在数据库管理和优化领域,索引的合理设计与使用对于提高查询性能具有至关重要的作用。本文将基于一个具体的示例表`TABLE1`来探讨SQL Server中索引对查询条件的影响,以及如何...

    SQLServer索引调优实践

    ### SQL Server索引调优实践 #### 索引的重要性 在数据库性能优化的过程中,索引扮演着极其重要的角色。不恰当的索引使用会导致其他优化措施的效果大打折扣,甚至变得毫无意义。因此,了解如何正确地创建、管理和...

Global site tag (gtag.js) - Google Analytics