首页 > 数据库 >使用数据库索引的优点与缺点

使用数据库索引的优点与缺点

时间:2023-11-08 16:01:31浏览次数:39  
标签:category 数据库 mytable 主键 索引 缺点 id


优点:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,

作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的。

缺点:建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。在某些情况下,建立索引的话也未必会快,例如索引放在一个不连续的存储空间时,这会增加读磁盘的负担,因此,哪个是最优,应该通过实际的使用环境来检验。

对于逻辑结构的优化,还应将表数据和索引数据分开表空间存储,分别使用独立的表空间。因为如果将表数据和索引数据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和Oracle索引数据存放在不同的表空间中,并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。

基础知识:

        为什么索引会增加速度?通常数据库的查询方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。大多数DB厂商实现索引都是基于一种数据结构——B树,这种结果能够大大提高查找速度。

根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。有关数据库所支持的索引功能的详细信息,请参见数据库文档。

提示:尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。


唯一索引

唯一索引是不允许其中任何两行具有相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。

主键索引

数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。

在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

聚集索引

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。


创建索引


最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,先建立一个如下的表。

CREATETABLEmytable(
  idserialprimarykey,
  category_idintnotnulldefault0,
  user_idintnotnulldefault0,
  adddateintnotnulldefault0
 );

如果在查询时常用类似以下的语句:

SELECT * FROM mytable WHERE category_id=1;

最直接的应对之道,是为category_id建立一个简单的索引:

CREATE INDEX mytable_categoryid ON mytable (category_id);

OK.如果有不止一个选择条件呢?例如:

SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

第一反应可能是,再给user_id建立一个索引。不好,这不是一个最佳的方法。可以建立多重的索引。

CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

建立合适索引需要考虑的因素:

总的来说,索引建立之前需要结合实际应用和数据分布进行分析再分析,通常会考虑下面几点

  1. 结合实际的应用。
  2. 考虑索引列的数据分布,如果distinct值很少且数据分布均匀的话,可能就不适合放在联合索引的最前面。
  3. 考虑索引的大小,在字段长度32的列和长度为7的列上建立索引大小肯定是不一样的,索引越大扫描的代价就越高。
  4. 考虑索引列冗余,可能你在索引中多冗余一个小字段,select就只走索引而不需要去扫描原表的数据。
  5. 考虑索引对其他sql的影响,是否其他的sql也可以使用这个索引。
  6. 考虑对是否可以对原有索引进行合并,评估合并会有多大的影响。

标签:category,数据库,mytable,主键,索引,缺点,id
From: https://blog.51cto.com/u_809530/8255996

相关文章

  • 大型数据库实验二
    实验二--熟悉常用的HDFS操作1、向hdfs中上传任意文本文件,如果文件已经存在,由用户指定是追加文件内容还是覆盖文件内容(准备了两个文件-wordcount.txt和local.txt)我这里定义的是在wordcount.txt文件末尾追加local.txt里面的内容:这里定义的是用local.txt的文件内容覆盖掉原来......
  • 有效降低数据库存储成本方案与实践
    背景随着平台的不断壮大,业务的不断发展,后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看,业务与系统要想健康的发展,成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向,很多企业部门也针对数据库存储降低成本进行了尝试,有的删数据、有的删索引、有的做......
  • mysql 远端数据库的数据备份与恢复
    备份基本语法mysqldump-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名称]>/home/username/备份文件.sql例如mysqldump-uroot-p123456-h192.168.1.100-P3306mydb>mydb_backup.sql恢复基本语法mysql-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名......
  • 运行Springboot测试类查询数据库数据显示白网页
    问题运行Springboot测试类时,查询数据库里面数据显示如下白网页程序报如下错误 解决方案 SpringBoot应用未能启动的原因是它没有找到合适的数据库配置具体来说,它需要一个数据源(DataSource),但未能在你的配置中找出,也没有找到任何嵌入式数据库(H2,HSQL或Derby)以下是几个......
  • RDS for Mysql 到云数据库GaussDB
    前言该实验旨在指导用户使用DRS将RDSMySQL上的数据迁移到GaussDB中。本实验涉及数据复制服务DRS(DataReplicationService)、关系型数据库服务RDS(RelationalDatabaseService)、GaussDB、数据管理服务DAS(DataAdminService)、VPC(虚拟私有云)、公网IP(EIP)等华为云服务。 说明1)、......
  • 网络数据库练习题
    练习一1  简述什么是网络数据库。 2  SQLServer2000的常见版本有哪些。 3  解释以下若干名词术语:关系,元组,属性,主键。 4  简述SQLServer2000中的4个系统数据库的主要用途。 5  简述SQLServer2000中的一些常用数据类型(datetime,int,float,money)的用法或......
  • mes 数据库 python sqlite
    importsqlite3fromsqlite3importErrordefcreate_connection():conn=None;try:conn=sqlite3.connect(':memory:')#创建一个内存数据库。对于文件数据库,您可以使用文件路径。print(f'successfulconnectionwithsqliteversion{sqlite3.......
  • SQL Server 2005 数据库对象命名规范 Database Naming Conventions(Guidelines)
    使用SQLServer2005命名数据库对象时可以参照微软的示例数据库AdventureWorks。其次可以参照以下内容:DatabaseNamingConventionsVersion1.1LastRevisedMay13,2004byJasonMaussThemaingoalofadoptinganamingconventionfordatabaseobjectsissothatyouand......
  • 高斯数据库HCNA之数据库基本概念
    二、数据库基本概念1、数据库和数据库实例数据库(Database)数据操作系统文件或磁盘数据块的集合比如数据文件,索引文件,结构文件并非所有的数据库系统都是基于文件的,也有直接把数据写入数据存储的形式数据库实例(DatabaseInstance)实例指的就是操作系统中一系列的进程以及为这......
  • oracle强制使用索引
    如下例子,Dim_Material_Info有6万条记录,建了索引IDX_DIM_MATERIAL_INFO_1: 但不知道什么原因,没有用上索引IDX_DIM_MATERIAL_INFO_1,造成查询速度很慢。 改造后的查询sql如下,强制使用索引:select/*+index(xIDX_DIM_MATERIAL_INFO_1)*/a.*From......