数据库创建索引的利弊

索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。

2. 为什么要建立索引,即索引的优点:

①  建立索引的列可以保证行的唯一性,生成唯一的rowId

②  建立索引可以有效缩短数据的检索时间

③  建立索引可以加快表与表之间的连接

④  为用来排序或者是分组的字段添加索引可以加快分组和排序顺序

3. 索引的缺点:

①  创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大

②  创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)

③  会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

4. 什么样的表跟列要建立索引:

①  总的来说就是数据量大的,经常进行查询操作的表要建立索引

②  表中字段建立索引应该遵循几个原则:

1)        越小的数据类型通常更好:越小的数据类型通常在磁盘、内存中都需要更少的空间,处理起来更快。

2)          简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂,处理起来也更耗时。

3)        尽量避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

4)        对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义,所以索引的建立应当更多的选取唯一性更高的字段。

③  表与表连接用于多表联合查询的约束条件的字段应当建立索引

④  用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引。

⑤  添加多列索引的时候,对应的多条件查询可以触发该索引的同时,索引最左侧的列的单条件查询也可以触发。

⑥  如果有些表注定只会进行查询所有,也就没必要添加索引,因为查询全部只能进行全量搜索即扫描全表。

5. 索引的原理:

索引的原理大致概括为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,然后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而建立索引之后,会将建立索引的KEY值放在一个n叉树上(BTree)。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索,次数约为log总条数,底数为页面存储数,例如一个100万数据的表,页面存储数为100,那么有索引的查询次数为3次log1000000100,但是全量搜索为100万次搜索,这种方式类似于二分法,但是这个是n分法。

索引对增删改的影响实际数据修改测试:

一个表有字段A、B、C,同时进行插入10000行记录测试

在没有建索引时平均完成时间是2.9秒

在对A字段建索引后平均完成时间是6.7秒

在对A字段和B字段建索引后平均完成时间是10.3秒

在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒

从以上测试结果可以明显看出索引对数据修改产生的影响

转自:https://blog.csdn.net/miracleww/article/details/53352738.

原文地址:https://www.cnblogs.com/ytc6/p/9370962.html

时间: 2024-11-13 06:58:36

数据库创建索引的利弊的相关文章

数据库创建索引的原则

数据库建立索引的原则 铁律一:天下没有免费的午餐,使用索引是需要付出代价的 索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本.若数据库管理员能够对索引所需要付出的代价有一个充分的认识,也就不会那么随意到处建立索引了.仔细数数,其实建立索引的代价还是蛮大的.如创建索引和维护索引都需要花费时间与精力.特别是在数据库设计的时候,数据库管理员为表中的哪些字段需要建立索引,要调研.要协调.如当建有索引的表中的纪录又增加.删除.修改操作时,数据库要对索引进行重新调整. 虽然这个工作数据库自

转载——数据库创建索引的一些原则

转载自:http://blog.csdn.net/tenfyguo/article/details/3974448 一,经常被用来过滤记录的字段. 1. primary key 字段, 系统自动创建主键的索引: 2. unique kye 字段,系统自动创建对应的索引; 3. foreign key 约束所定义的作为外键的字段; 4. 在查询中用来连接表的字段; 5. 经常用来作为排序(order by 的字段)基准的字段; 二. 索引会占用磁盘空间,创建不必要的索引只会形成浪费. 三. 索引的

数据库创建索引的优缺点

为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能,优点: 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义. 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间. 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个

数据库创建索引有什么优点和缺点

数据库中索引的优缺点为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能,优点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因.第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义.第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间.第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 也许会有人要问:增加索引有如此多的优点,为什么不对表

数据库lib7第2, 3题(创建索引和触发器)

2. 分别为上述建立的表格建立适当的索引,请描述建立索引的过程(可以截图或者写SQL).其中,要求对SPJ标中的SNo, PNo字段各建立一个索引,为(PNo, JNo)的组合建立一个索引.请问,SNo和PNo上的索引是聚集索引还是非聚集索引?为什么? 附上代码: 1 create index SNo_Index on SPJ(SNo) 2 create index PNo_Index on SPJ(PNo) 3 create clustered index SNo_PNo_Index on S

记录一次数据库某表未创建索引造成的问题

现象描述: 昨天鹰网监控告知廊坊某台物理机CPU使用率接近100%,查看得知每颗逻辑CPU的使用率都接近了100%,但该数据库机器是测试机器,按理说不会造成此问题.截图如下: 处理步骤: 1. 查看消耗大量CPU资源和I/O等待的PID 通过TOP命令即可查看 2. 通过PID查看正在执行的SQL SELECT sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE(sql_hash_value, 0

oracle数据库什么情况下创建索引比较好

索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽 然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用.这就好像即使字典没有目录的话,用户仍然可以使用它一 样.可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典.数据库也是如此.若没有建立相关索引的话,则数据库在查询记录的 时候,不得不去查询整个表

MySQL外键及级联删除 && 表的存储引擎与创建索引 && 删除数据库和表

Messages表: mysql>create table Messages( ->message_id int auto_increment primary key, ->user_name varchar(50) not null, ->author_id int not null, ->body text, ->forum_id int not null); Forums表: mysql>create table Forums( ->forum_id

数据库优化之创建索引

索引提供指针以指向存储在表中指定列的数据,然后根据指定的次序排列这些指针,在根据指针到达包含该值的行 什么是索引 数据库中的索引和数据的目录相似,利用目录快速查找所需的信息.在数据库中,索引是某个表中一列或者若干列值的集合,以及物流标识这些值的数据页的逻辑指针清单.是SQL Server编排数据的内部方法,通过索引,可快速查找数据,而无需扫描整个表 索引页是数据库中存储索引的数据页,存放数据行的关键字页以及该数据行的地址指针 索引分类 在SQL Server中,常见的索引有以下六类: 唯一索引: