数据库如何进行索引优化

数据库索引

1.什么是索引

在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。
A)索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。
B)对于非聚集索引,有些查询甚至可以不访问数据页。
C)聚集索引可以避免数据插入操作集中于表的最后一个数据页。
D)一些情况下,索引还可用于避免排序操作。

 

当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。

例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。

2.索引的存储

一条索引记录中包含的基本信息包括:键值(即你定义索引时指定的所有字段的值)+逻辑指针(指向数据页或者另一索引页)。

  

当你为一张空表创建索引时,数据库系统将为你分配一个索引页,该索引页在你插入数据前一直是空的。此页此时既是根结点,也是叶结点。每当你往表中插入一行数据,数据库系统即向此根结点中插入一行索引记录。当根结点满时,数据库系统大抵按以下步骤进行分裂:
A)创建两个儿子结点
B)将原根结点中的数据近似地拆成两半,分别写入新的两个儿子结点
C)根结点中加上指向两个儿子结点的指针

 

通常状况下,由于索引记录仅包含索引字段值(以及4-9字节的指针),索引实体比真实的数据行要小许多,索引页相较数据页来说要密集许多。一个索引页可以存储数量更多的索引记录,这意味着在索引中查找时在I/O上占很大的优势,理解这一点有助于从本质上了解使用索引的优势。

3.索引的类型


A)  唯一索引:唯一索引不允许两行具有相同索引值

B) 主键索引:定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型.要求每个值唯一的,并且不能为空。

C)聚集索引,表数据按照索引的顺序来存储的。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页,每个表只能一个

D)非聚集索引,表数据存储顺序与索引顺序无关。对于非聚集索引,数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。

 

4. 索引创建语法

crate [unique](唯一) [clustered](聚集) [nonclustered] index  索引名称 on 表名(列名)

 

注:以上[]中的值根据需要选择一个

 

5.索引删除语法

drop index 表名.索引名

sysindexes:系统索引表

 

6.索引优缺点

 优点: 创建索引可以大大提高系统的性能。
    1):通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
    2):可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
    3):可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    4):在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    5):通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。


 缺点: 1):创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    2):索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    3):当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

 

7.在哪建索引

  索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

  一般来说,应该在这些列上创建索引:
  1):在经常需要搜索的列上,可以加快搜索的速度;
  2):在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
  3):在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
  4):在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
  5):在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。


  同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
  1):对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。

   相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  2):对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,

   即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
  3):对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引。
  4):当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。

    当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

人生应该要努力一点;做好自己然后时机成熟的时候方可成功!要做的就是不骄不躁缓缓向上

 

转载于:https://www.cnblogs.com/sweet-ice/p/10512019.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php7如何安装swoole,PHP7如何安装Swoole?

PHP7如何安装Swoole?发布时间:2020-05-19 16:35:02来源:亿速云阅读:135作者:Leah这篇文章给大家分享的是PHP7安装Swoole的详细安装教程,相信大部分人都还不知道怎么安装,为了让大家学会&#xf…

第二章总结

第二章 寄存器 1.CPU概述 一个典型的CPU由运算器、控制器、寄存器等器件组成。 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其它器件的联系。 2.通用寄存器 8086CPU中,寄存器AX, BX, CX, DX通常用于存放一般性数据,称为通用寄存器…

赞!15个来自 CodePen 的酷炫 CSS 动画效果

CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果。你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果。 今天这篇文章为大家挑选了15个超炫的 CSS 动画效果的例子&#x…

Java 8 Friday Goodies:新的新I / O API

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了…

ashly理器4.8软件汉化版_AMD 处理器核心比英特尔多还更便宜?英特尔回应

IT之家 9 月 25 日消息 英特尔已在本月初发布了 11 代酷睿移动处理器,搭载 11 代酷睿的产品最早将在 10 月上市。现在,新浪科技访了英特尔公司中国零售销售集团总经理唐炯,就 11 代酷睿产品进行讨论。在谈到 AMD 处理器比英特尔便宜&#xff…

JAVA比较两个List集合的方法

import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set;public class FindNumber { public static void main(String[] args) { // 注意:一定要使用创建对象…

js 解析php serialize,php如何解析jquery serialize 提交后的数据

客户端通过jquery serialize 提交表单数据$("#submit_survey").click(function(){ $.post(SITE_URLactivity/survey/savesurvey, {data:$(#survey_form).serialize()}, function(response){ if (response.error_code) { infotips(response.msg, $(.submit_tips)); } …

OutOfMemoryError:解决方案反模式

这些年来,我们一直密切关注以OutOfMemoryError消息的不同形式打包的问题。 通过专门的服务(例如Google警报),每天就特定关键字的新问题进行摘要,使我们对应用程序因日志中的java.lang.OutOfMemoryError失败而出现的情况…

python在线问卷调查系统源代码_基于Python 练习1情况的在线问卷

Q1. 您每个月的生活费是?(单选题)Q2. 您在职的职位是:(单选题)Q3. 您的家庭背景?(单选题)Q4. 下列哪一个是Python中正确的变量名?()(单选题)A Sprout*1B 1SproutC Sprout 1D Sprout_1Q5. Turtle 中的 Write 命令是用来做什么的 ()…

leetcood学习笔记-58-最后一个单词的长度

题目描述: 第一次解答: class Solution:def lengthOfLastWord(self, s: str) -> int:Ls.strip().split(" ")if L[-1]"" :return 0return len(L[-1]) 优化后: class Solution:def lengthOfLastWord(self, s: str) ->…

Plyr – 简单,灵活的 HTML5 媒体播放器

Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕。它是只支持现代浏览器,轻量,方便和可定制的媒体播放器。还有的标题和屏幕阅读器的全面支持。 在线演示 源码下载 您可能感兴趣的相关文章网站开发中很有用的 …

第一章 SpringBoot快速入门

1.1、包依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.14.RELEASE</version><relativePath/> <!-- lookup parent from repository --> …

使用Redis的简单消息队列

在本文中&#xff0c;我们将使用列表命令将Redis用作简单的消息队列。 假设我们有一个允许用户上传照片的应用程序。 然后在应用程序中&#xff0c;我们以不同大小显示照片&#xff0c;例如Thumb&#xff0c;Medium和Large。 在第一个实现中&#xff0c;我们可以承担在同一请…

solaris配置php,Solaris下安装Oracle_启动Oracle及监听

无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都见不到&#xff0c;后来&#xff0c;能够看到安无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都…

python es 数据库 ik_Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示

一、中间件简介1、基础概念ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎…

【C++】满二叉树问题

/* 给出一棵满二叉树的先序遍历&#xff0c;有两种节点&#xff1a;字母节点&#xff08;A-Z&#xff0c;无重复&#xff09;和空节点&#xff08;#&#xff09;。要求这个树的中序遍历。输出中序遍历时不需要输出#。 满二叉树的层数n满足1<n<5。Sample Input: ABC#D#ESa…

NativeScript - JS 构建跨平台的原生 APP

使用 NativeScript&#xff0c;你可以用现有的 JavaScript 和 CSS 技术来编写 iOS、Android 和 Windows Phone 原生移动应用程序。由原生平台的呈现引擎呈现界面而不是 WebView&#xff0c;正因为如此&#xff0c;应用程序的整个使用体验都是原生的。 NativeScript 使您可以使用…

java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码

解决 JAVA WebSocket 解析 base64 后中文字符串乱码解决 JAVA WebSocket 解析 base64 后中文字符串乱码春风如贵客&#xff0c;一到便繁华。各位看官先赞再看&#xff0c;养成好习惯(●?&#xff40;●)前言&#xff1a;项目基于WebSocket实现了一个功能&#xff0c;其中要接受…

Riot - 比 Facebook React 更轻量的 UI 库

Riot 是一个类似 Facebook React 的用户界面库&#xff0c;只有3.5KB&#xff0c;非常轻量。支持IE8 浏览器的自定义标签&#xff0c;虚拟 DOM&#xff0c;语法简洁。Riot 给前端开发人员提供了除 React 和 Ploymer 之外的新选择&#xff0c;值得一试。 在线演示 源码下载…

python爬虫大众点评_Python爬虫(三)爬取大众点评网

大众点评的网站爬虫难点在于其对网页上的文字做了加密处理&#xff0c;所以学习了大佬的方法&#xff0c;链接如下&#xff1a;如下图所示&#xff0c;大众点评的评论数&#xff0c;价格和地址等信息对应在源码中都是方框&#xff0c;无法使用常规手段直接爬取到信息&#xff0…