热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据库系统概论-[04]索引-mysql教程

1、索引概述建立索引是加快查询速度的有效手段,用户可以根据应用环境的需要,在基本表上建立一个或者多个索引,以提供多种存取路径,加快查找速度。一般来说,建立与删除索引由数据库管理员DBA或者表的属主(owner),即建立表的人负责完成,系统在存取数据

1、索引概述 建立索引是加快查询速度的有效手段,用户可以根据应用环境的需要,在基本表上建立一个或者多个索引,以提供多种存取路径,加快查找速度。 一般来说,建立与删除索引由数据库管理员DBA或者表的属主(owner),即建立表的人负责完成,系统在存取数据

1、索引概述

建立索引是加快查询速度的有效手段,用户可以根据应用环境的需要,在基本表上建立一个或者多个索引,以提供多种存取路径,加快查找速度。

一般来说,建立与删除索引由数据库管理员DBA或者表的属主(owner),即建立表的人负责完成,系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能显示地选择索引。

2、索引优点和缺点

首先明白为什么创建索引,因为创建索引可以大大提高系统的性能。

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。可以大大加快数据的检索速度,这也是创建索引的最主要的原因。可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性,虽然索引有许多的优点,但是,为表中的每一个列都增加索引,是非常不明智的,这是因为,增加索引也有许多不利的一个方面。 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立举聚簇索引,那么需要的空间就会更大。当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。索引是建立在数据库表中的某些列上,因此在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引,一般来说,应该在这些列上创建索引:

1、在经常需要搜索的列上,可以加快搜索速度

2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。

3、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。

4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。

5、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。

6、在经常使用where子句中的列上面创建索引,加快条件的判断速度。 同样对于有些列是不应该创建索引的,一般来说,不应该创建索引的这些列具有下列特点:

1、对于那些在查询中很少使用或者参考的列不应该创建索引,这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度,相反,由于增加了索引,反而降低了系统的维护速度和增加了空间需求。

2、对于那些只有很少数据值的列也不应该增加索引,这是因为,由于这些列的取值很少,比如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大,着呢国家索引,并不能明显加快检索速度。

3、对于那些定义为text、Image和bit数据类型的列不应该增加索引,这是因为,这些列的数据量要么相当大,要么取值很少。

4、当修改性能远远大于检索性能时,不应该创建索引,这是因为,修改性能和检索性能是互相矛盾的,当增加索引时,会提高检索性能,但是会降低修改性能,当减少索引时,会提高修改性能,降低检索性能,因此,当修改性能远远大于检索性能时,不应该创建索引。

3、创建索引 创建索引有多种方法,这些方法包括直接创建索引方法和间接创建索引的方法,直接创建索引,使用如下语句: CREATE [UNIQUE][CLUSTER][INDEX <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序>]]......);说明:其中<表名>是要创建索引的基本表的名字,索引还可以建立在该表的一列或者多列上,各列之间用逗号分隔,每个<列名>后面还可以用<次序>指定索引值的排序次序,可选ASC(升序)或者DESC(降序),缺省值为ASC。 UNIQUE表明此索引的每一个索引值值对应唯一的数据记录。 CLUSTER表示要建立的索引是聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。还有一种方法创建索引,在表中定义主键约束或者唯一约束时,同时也创建了索引,虽然,这两种方法都可以创建索引,但是它们创建索引的具体内容是有区别的:当在表上定义主键或者唯一约束时,如果表中已经有了使用CREATE INDEX语句创建的标准索引的,那么主键约束或者唯一性约束创建的索引覆盖以前创建的标准索引,也就是说主键约束或者唯一约束创建的索引的优先级高于使用CREATE INDEX语句创建的索引。 eg:为学生-课程数据库中的Student,Course,SC 3个表建立索引,其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

4、删除索引 索引一经建立,就有系统使用和维护它,不需要用户的干预,建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引,从而降低了查询效率,这时可以删除一些不必要的索引。在SQL中,删除索引使用DROP INDEX 语句,其一般格式为: DROP INDEX <索引名>; eg:删除Student表的Stusname索引 DROP INDEX Stusname;删除索引时,系统会同时删除数据字典中删除有该索引的描述。

5、总结 在RDBMS中索引一般采用B+树、HASH索引来实现,B+树索引具有动态平衡的优点,HASH索引具有查找速度快的特点,索引是关系数据库的内部实现技术,属于内模式的范畴。用户使用CREATE INDEX语句定义索引时,可以定义索引是唯一索引、非唯一索引或者聚餐索引,至于某一个索引是采用B+树,还是HASH索引则由具体的RDBMS来决定。


推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 本文介绍了如何使用 PostgreSQL 的 `UPDATE ... FROM` 语法,通过映射表实现对多行记录进行高效的批量更新。这种方法不仅适用于单列更新,还支持多列的同时更新。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
author-avatar
爲妳奮鬥壹輩子丶故事_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有