数据库索引设计与优化
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):当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。
当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。
使用索引的场景:
1. 当数据多且字段值有相同的值得时候用普通索引。
2. 当字段多且字段值没有重复的时候用唯一索引。
3. 当有多个字段名都经常被查询的话用复合索引。
4. 普通索引不支持空值,唯一索引支持空值。
5. 但是,若是这张表增删改多而查询较少的话,就不要创建索引了,因为如果你给一列创建了索引,那么对该列进行增删改的时候,都会先访问这一列的索引,
6. 若是增,则在这一列的索引内以新填入的这个字段名的值为名创建索引的子集,
7. 若是改,则会把原来的删掉,再添入一个以这个字段名的新值为名创建索引的子集,
8. 若是删,则会把索引中以这个字段为名的索引的子集删掉。
9. 所以,会对增删改的执行减缓速度,
10. 所以,若是这张表增删改多而查询较少的话,就不要创建索引了。
11. 更新太频繁地字段不适合创建索引。
12. 不会出现在where条件中的字段不该建立索引。
数据库索引设计与优化相关推荐
- 数据库索引设计与优化(笔记):第5章 前瞻性索引设计(主要是QUBE,快速上限估算法)
这一章就比较复杂了 基本问题法(BQ) 对每个SELECT语句,按照下列步骤来考虑 问题:是否有一个已存在的或者计划中的索引包含了WHERE子句所引用的所有列(一个半宽索引)? 如果答案是否,则首先考 ...
- 数据库架构设计与优化
数据库架构设计与优化 导航: 数据库架构设计与优化 一. 影响数据库性能的原因 1.1 影响数据库的因素 1.2 影响MYSQL性能的因素有哪些? 1.3 事务 二. 什么影响了MYSQL性能 2.1 ...
- 深入理解MySQL索引设计和优化原则
索引类型 探讨索引设计和优化原则之前,先给大家熟悉一下索引类型: 主键索引PRIMARY KEY:它是一种特殊的唯一索引,不允许有空值.一般是在建表的时候同时创建主键索引. 唯一索引UNIQUE:唯一 ...
- MySQL数据库——索引机制及其优化
基础知识储备 局部性原理 发现程序和数据的访问都有聚集成群的倾向,在一段时间内,仅使用其中一小部 分(也称空间局部性),或者最近访问过得程序代码和数据,很快又被访问的可 能性很大(也称时间局部性). ...
- MYSQL数据库索引设计的原则
索引说明 InnoDB是使用B+树来实现其索引功能的.在B+树中,内节点(非叶子节点)存储了行数据的键,而叶子节点存储了所有的行数据,而B树的每个节点都存储了真实的数据.这种数据结构,决定了两者有以下 ...
- Mysql优化之三:数据库索引原理及优化
转自:https://blog.csdn.net/suifeng3051/article/details/52669644 Mysql优化主要是索引的优化 1. 平衡多路搜索树B树(B-tree) 上 ...
- access建立两个字段唯一索引_数据库索引原理及优化
微信公众号:云计算通俗讲义 持续输出技术干货,欢迎关注! 通过本文你将了解: 概述 分类 索引底层实现原理 基本操作 索引失效 索引优化 01 概述 索引是帮助MySQL高效获取数据的排好序的数据结构 ...
- 高并发大数据量的数据库的设计与优化
1.可以使用静态页面的地方,使用静态页面,减少页面解析时间. 2.尽量使用缓存技术来做.用户缓存.页面缓存等一切缓存,使用特定的机制进行刷新.利用消耗内存空间来换取用户的效率.同时减少数据库的访问次数 ...
- 03基于区块链的电子病历数据库索引设计
原文标题:Index Design of Electronic Medical Record Database Using Blockchain 原文作者:Jingwen Li,Jian Wang 原 ...
最新文章
- 了解C++默默编写并调用哪些函数
- BCE或能成为BCH的一个侧链
- 登录锁定状态下Win7关机技巧总结
- pytorch中的CrossEntropyLoss
- 数据结构-----基于双数组的Trie树
- Medusa 又一个 Shopify 的开源替代品!
- 找回Google Reader丢失的笔记(notes)
- 2016年最酷的十大安全初创公司
- RESTful 架构详解设计模式一种约束
- A* 寻路算法[转载]
- Vue 2.0 华丽的音乐搜索播放 Demo
- 【生信】全基因组测序(WGS)
- 翟菜花:从风流到下流,杜蕾斯新文案为何被人口诛笔伐?
- 5月6阴阳师服务器维护,《阴阳师》手游5月6日维护更新公告
- Vue2.0 —— 运用算法实现 AST 抽象语法树
- AES链路弹性和故障转移
- 为什么自学前端容易失败?数千名新手程序员得出结论
- 深圳x医院ICU危重症信息系统MongoDB误删-恢复记录-2020.10.17
- 免费的兑换码Java
- P1179 [NOIP2010 普及组] 数字统计
热门文章
- java sleep原理_Java线程休眠(sleep)示例
- jquery的attr和removeAttr实现checkbox全选和取消全选问题
- 手撕Java类 Collector
- 交换机接口类型Access和Trunk详解
- ESP32-C3 VScode + PIO Arduino环境下使用TFT_eSPI库 驱动两块0.96‘ ST7735S拼接后运行LVGL
- 【转】突破区块链不可能三角:异步共识组 [Monoxide]
- 实现图文混排ListView展示 ---- Android版
- 【BZOJ4883】棋盘上的守卫
- 20190716 DP 练习赛
- python创建文件和文件夹