精华内容
下载资源
问答
  • 在数据库中建立索引的作用是
    千次阅读
    2019-01-03 22:36:35

    为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。

    第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

    第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。

    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

    第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    更多相关内容
  • 数据库如何建立索引

    千次阅读 2022-07-16 00:21:41
    数据库如何建立索引

    1、普通索引

    CREATE INDEX indexName ON mytable(username(length));
    

    创建表的时候直接指定:

    CREATE TABLE mytable(
    	ID INT NOT NULL,
    	username VARCHAR(16) NOT NULL,
    	INDEX [indexName] (username(length))
    );
    

    删除索引的语法:

    DROP INDEX [indexName] ON mytable;
    

    2、唯一索引

    它与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    创建索引:

    CREATE UNIQUE INDEX indexName ON mytable(username(length))
    

    修改表结构:

    ALTER table mytable ADD UNIQUE [indexName] (username(length))
    

    创建表的时候直接指定:

    CREATE TABLE mytable(
    	ID INT NOT NULL,
    	username VARCHAR(16) NOT NULL,
    	UNIQUE [indexName] (username(length))
    );
    
    展开全文
  • 在数据库中索引也允许数据库程序迅速地找到表的数据,而不必扫描整个数据库。 首先我们需要明白为什么索引会提高查询速度,数据库在执行一条SQL语句的时候,默认扫描方式是根据搜索条件进行全表扫描,遇到匹配...

    目录

    一、概述

    二、数据库为什么要设计索引?

    三、哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?

    四、数据库索引为什么使用B+树?

    五、为什么m叉的B+树比二叉搜索树的高度大大降低?

    六、总结


    一、概述

    数据库索引是为了提高查询速度而对表字段附加的一种标识。简单来说,索引其实是一种数据结构。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

    首先我们需要明白为什么索引会提高查询速度,数据库在执行一条SQL语句的时候,默认扫描方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以数据库索引能明显提高查询的速度。

    下面列举几种适合建立索引的情况:

    1. 经常在where条件中作为查询条件的字段可以建立索引;
    2. 外键关联列可以建立索引;
    3. order by排序后面的字段可以建立索引;
    4. group by分组后的字段可以建立索引;
    5. .......

    当然,并不是所有情况下都适合建立索引,如下几种情况就不太适合建立索引:

    1. 经常增、删、改的字段不适合建立索引,每次执行,索引需重新建立;
    2. 数据过滤性很差的字段不适合建立索引,如性别字段;
    3. 当表数据量过少的时候不太适合建立索引,因为索引占用存储空间;
    4. ..........

    二、数据库为什么要设计索引?

    举个最简单的例子,小时候我们遇到不会读的字,是不是拿出《新华字典》,大家都知道一本《新华字典》里面有成千上万个字,如何快速的找到我们不会读的那个字呢?

    《新华字段》最前面几页列出了我们汉字的笔画索引,如下图:

    通过笔画索引表查询,我们是不是可以大大缩小我们查找的范围了,数据库索引的作用大体相似。假设数据库中存在1000万条数据,如何能够在最短的时间内搜索到满足条件的记录呢,显然可以引入索引来解决。

    三、哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?

    加速查找速度的数据结构,常见的有两类:

    (1)、哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1);

    (2)、树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n));

    可以看到,不管是读请求,还是写请求,哈希类型的索引,都要比树型的索引更快一些。

    那为什么索引结构要设计成树型呢?

    索引设计成树形,和SQL的需求相关。

    对于单行查询的SQL,如:

    select * from user t where t.user_id = "1356894556";

    因为上述每次查询肯定都只会返回一条记录,所以索引结构使用hash的话,确实会比用树结构快。

    但是,数据库中的查询并不仅仅只有单行查询,还有分组group by、排序oder by 等等。

    遇上如上除了单行查询的情况,如果使用hash索引的话,时间复杂度会退化为O(n),而如果使用树型索引的话,由于树的“有序”特性,依然能够保持O(log(n)) 的高效率,时间复杂度不会退化。

    另外,hash索引可能会存在hash冲突情况。

    四、数据库索引为什么使用B+树?

    数据结构中,树主要有以下几种:

    1. 二叉搜索树;
    2. B树;
    3. B+树;
    • 第一种:二叉搜索树

    二叉搜索树,也是最简单的树结构。主要特征:

    1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    3. 左、右子树也分别为二叉排序树

    那么,二叉搜索树为什么不适合用作数据库索引?

    (1)、当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢;

    (2)、每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO;

    • 第二种:B树

    B树特征:

    1. 树中每个结点最多含有m个孩子(m>=2);
    2. 除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);
    3. 叶子节点,非叶子节点,都存储数据;
    4. 中序遍历,可以获得所有节点;
    5. 若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

    B树为什么适合做索引?

    (1)、B树结构是m分叉的,高度能够大大降低;

    (2)、每个节点可以存储j个记录,如果将节点大小设置为页大小,例如4K,能够充分的利用预读的特性,极大减少磁盘IO;

    • 第三种:B+树

    B+树叶是m叉搜索树,在B树的基础上,做了一些改进:

    1. 非叶子节点不再存储数据,数据只存储在同一层的叶子节点上;
    2. 叶子之间,增加了链表,获取所有节点,不再需要中序遍历;
    3. 叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加速,适合内存存储;
    4. 非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引;

    五、为什么m叉的B+树比二叉搜索树的高度大大降低?

    大概计算一下:

    (1)、局部性原理,将一个节点的大小设为一页,一页4K,假设一个KEY有8字节,一个节点大约可以存储500个KEY,即j = 500;(1KB = 1024字节 ,4KB = 4096字节, 4096 / 8 = 512个)

    (2)、m叉B+树,大概m / 2 <= j <= m,即可以差不多是1000叉树;

    (3)、那么:

    一层树:1个节点,1 * 500个KEY,大小4K;

    二层树:1000个节点,1000 * 500 = 50W个KEY,大小1000 * 4K = 4M

    三层树:1000 * 1000个节点,1000 * 1000 * 500 = 5亿个KEY,大小1000 * 1000 * 4K = 4G

    可以看到,存储大量的数据(5亿),并不需要太高树的深度(高度3),索引也不是太占内存(4G)。

    六、总结

    • 数据库索引用于加速查询;
    • 虽然哈希索引是O(1),树索引是O(log(n)),但SQL有很多“有序”需求,故数据库使用树型索引;
    • 数据预读的思路是:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的数据,以便未来减少磁盘IO;
    • 局部性原理:软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO;
    • 数据库的索引最常用B+树:

           (1)、很适合磁盘存储,能够充分利用局部性原理,磁盘预读;

      (2)、很低的树高度,能够存储大量数据;

      (3)、索引本身占用的内存很小;

      (4)、能够很好的支持单点查询,范围查询,有序性查询;

    参考文档:https://zhuanlan.zhihu.com/p/118444365

    展开全文
  • 如何达梦数据库中创建索引

    千次阅读 2020-09-05 15:32:48
    可以使用CREATE INDEX语句明确地创建索引,例如emp表的ename列上创建一个名为emp_ename的索引,该索引使用表空间users。 SQL> create index emp_ename on emp(ename) STORAGE(INITIAL 50,NEXT 50,ON USERS); 该...

    1、直接创建索引
    可以使用CREATE INDEX语句明确地创建索引,例如在emp表的ename列上创建一个名为emp_ename的索引,该索引使用表空间users。
    SQL> create index emp_ename on emp(ename) STORAGE(INITIAL 50,NEXT 50,ON USERS);
    该语句为该索引明确地指定了几个存储位置和一个表空间。如果没有给索引指定存储选项,则INITIAL和NEXT等存储选项会自动使用表空间的默认存储选项。
    2 、创建聚集索引
    当建表语句未指定聚集索引键时,达梦数据库默认的聚集索引键是ROWID。若指定索引键,表中数据都会根据指定索引键排序。
    建表后,DM8也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序。
    SQL> CREATE CLUSTER INDEX clu_emp ON emp(ename);
    建议在建表时就确定聚集索引键,或在表中数据比较少时新键聚集索引,而尽量不要对数据量非常大的表建立聚集索引。
    3、 创建唯一索引
    索引可以是唯一的或非唯一的,唯一索引可以保证表上不会有两行数据在键列上具有相同的值,非唯一索引不会在键列上施加这个限制。
    使用CREATE UNIQUE INDEX语句来创建唯一索引
    SQL> CREATE UNIQUE INDEX dept_unique_index ON dept (dname) storage (on users);
    用户希望在列上定义UNIQUE完整性约束,达梦数据库可以通过自动地在唯一键上定义一个唯一索引来保证UNIQUE完整性约束。
    4 、自动创建与约束相关的唯一索引
    达梦数据库可以通过在唯一键或主键上创建一个唯一索引来在表上实施UNIQUE KEY 或PRIMARY KEY完整性约束。
    SQL> alter table emp add constraint pk_emp_name primary key(name);
    上面语句会自动在表emp的name列上创建一个唯一索引。
    5、 创建基于函数的索引
    基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先计算出来并存储在索引中。
    1.创建更强有力的分类,可以用UPPER和LOWER函数执行区分大小写的分类
    2.预先计算出计算密集的函数的值,并在索引中将其分类。可以在索引中存储要经常访问的计算密集的函数,当需要访问值时,该值已经计算出来了。可以极大地改善查询的执行性能。
    3.增加了优化器执行范围扫描而不是全表扫描的情况的数量
    SQL> create index idx on example_tab(column_a + column_b);
    SQL> select * from example_tab where column_a + column_b <10;
    上面创建的索引是建立在column_a + column_b 之上的,索引优化器可以在下面的查询与语句中使用范围扫描。优化器根据该索引计算查询代价,如果代价最少,优化器就会选择该函数索引,column_a+column_b就不会重复计算。
    6、 创建位图索引
    位图索引只要针对含有大量相同值得列而创建。位图索引被广泛引用到数据仓库中,创建方式和普通索引一致,对低基数(不同得值很少)得列创建位图索引,能够有效提高基于该列得查询效率。且执行查询语句的WEHER子句中带有AND和OR谓词时,效率更加明显。
    SQL> create bitmap index s1 on purchasing.vendor(vendorid);
    创建一个位图索引

    展开全文
  • //复合索引,当条件中,经常去查询多个条件时,可以把多个条件放在一个索引中 (5) create index 索引名 on 表(字段 desc); //排序后创建索引 (6) create index 索引名 on 表名 (字段) reverse; //反转索引,消除...
  • 建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能。 第一、通过创建唯一性索引,可以保证数据库每一行数据的唯一性。 第二、可以大大加快 数据的检索速度,这也是创建...
  • 数据库建立索引的优缺点

    千次阅读 2019-04-01 14:21:34
    索引中包含由表或视图中的一列或多列生成的键。这些键存储一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。 为什么要建立索引,即索引的优点: ① 建立索引的列可以保证行的唯一性,生成唯一的...
  • 数据库之创建索引

    千次阅读 2020-12-04 08:45:00
    索引有什么用? 假设有一张表,表的数据有10W条数据,其中有一...如果我nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname='css’的数据,这样我们就很轻松的找到名字叫‘小明’的那一行或者多行
  • 数据库建立索引常用的规则

    千次阅读 2019-08-01 19:04:11
    数据库建立索引常用的规则如下: 1、表的主键、外键必须有索引;  2、数据量...
  • 数据库在执行一条sql语句时,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表一次定位到特定值的行数,大大减少遍历匹配的行数,...
  • 当我们面对大量的数据查询时,为了提高查询效率,我们在数据库中总要使用到索引。那么索引究竟是怎么样的东西呢? 索引本质 索引其实就是一种数据结构,他将数据库中的数据以一定的数据结构算法进行存储,能够帮助...
  • 数据库建立索引的原则

    千次阅读 2016-11-25 18:17:19
    索引查询是数据库中重要的记录查询方法,要不要进入索引以及那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑,下面给出实际的一些通用的原则: 1. 经常用作过滤器的字段上建立索引;  2. ...
  • 数据库建立索引怎么利用索引查询

    千次阅读 2019-03-05 11:32:04
    数据库建立索引怎么利用索引查询?精选 1.合理使用索引 索引是数据库重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。 索引的使用要恰到好处,其...
  • 主流数据库索引及其例子

    千次阅读 多人点赞 2022-04-10 22:36:25
    在数据库中使用索引的优缺点: 索引分类 普通索引 唯─性索引 主键索引 全文索引 空间索引 其他分类 索引设置的基本原则 创建索引 使用CREATE INDEX语句建立索引 创建表时创建索引 修改表时创建索引 ...
  • 数据库索引详解

    万次阅读 多人点赞 2021-11-17 19:16:13
    数据库索引,是数据库管理系统一个排序的数据结构,以协助快速查询,更新数据库中表的数据。索引的实现通常使用B树和变种的B+树(MySQL常用的索引就是B+树)。除了数据之外,数据库系统还维护为满足特定查找算法的...
  • 索引(index)是帮助MySQL高效获取数据的数据结构(有效),数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以这些数据结构上实现高级查找算法,...
  • 为什么要建立索引?  索引用于快速找出某个列有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表查询的列有一个索引,MySQL...
  • 我连什么是索引都不是很清晰明了,你给我讲什么建立索引的时机?!!! 是的,很多同学只是有所耳闻,并且可能就是只知道索引可以优化sql效率,但是至于其所以然并不清晰。那么我们现在先谈谈什么是索引。 ...
  • 数据库建立索引常用的原则

    万次阅读 2018-09-18 10:59:20
    4、经常出现Where子句的字段,特别是大表的字段,应该建立索引;5、索引应该建选择性高的字段上;6、索引应该建小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量...
  • 索引中包含由表或视图中的一列或多列生成的键。这些键存储一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。2. 为什么要建立索引,即索引的优点:1) 建立索引的列可以保证行的唯一性,生成唯一的...
  • 索引是对数据库的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库的特定信息。 索引类型 (1)普通索引 ◆创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username ...
  • 数据库 视图、索引建立与查看

    千次阅读 2018-10-02 17:46:17
    视图建立建立一张虚表) create view IS_Student AS select Sno,Sname,Sage  from Student where Sdept='IS'; 视图查看(视图是一张虚表 当普通表查询即可...--为SC表按照学号升序 课程号降序 建立唯一索引 cr...
  • 数据库索引的理解及适合建立索引的字段

    万次阅读 多人点赞 2018-03-06 13:17:43
    转载深入浅出数据库索引原理,哪些字段适合建立索引 问题 为什么要给表加上主键? 为什么加索引后会使查询变快? 为什么加索引后会使写入、修改、删除变慢? 什么情况下要同时两个字段上建索引? 这些问题...
  • 数据库专题】如何理解数据库索引

    千次阅读 多人点赞 2022-06-06 01:04:20
    索引是帮助数据库来**高效获取数据**的一种**排好顺序**的数据结构;
  • 达梦数据库简介及索引创建

    千次阅读 2022-05-20 14:04:44
    前言: ...40余年的发展过程,达梦公司国产数据库行业持续领跑,先后完成了近60项国家及省市级的科研开发项目,取得了近400项研究成果,皆为国际先进、国内领先水平,有30多项国家、省部级奖励。
  • 数据库为什么要建立索引

    千次阅读 2018-06-03 16:46:23
    一:什么是索引?索引(Index)是帮助MySQL高效获取数据的数据结构。二:为什么要建立索引?一个没有索引的数据库表就相当于一本...三:选择什么字段建立索引索引也是要占用存储空间的,建立索引的时候也是有一定...
  • 数据库中索引(index)介绍

    万次阅读 2019-01-16 10:14:15
    除了实际需要使用的数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据库中实际需要使用的数据,这样就可以这些数据结构上实现高级查找算法。这种数据结构,就是...
  • 数据库创建索引的几种方法

    千次阅读 2021-04-06 16:14:15
    下面开始建立索引: 普通索引 添加INDEX ALTER TABLE table_name ADD INDEX index_name ( column ) ALTER TABLE uclocklog ADD INDEX index_uid(uid); 再执行查询语句,查询时间如下: 删除索引: DROP INDEX ...
  • 数据库联合索引

    千次阅读 2022-04-11 15:34:15
    数据库索引、优化、联合索引、组合索引
  • 数据库中如何正确使用索引

    千次阅读 2019-07-08 14:16:44
    SQL索引有两种,聚集索引和非聚集索引。 例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到... 聚集索引就是在数据库被开辟一个物理空间存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 373,212
精华内容 149,284
热门标签
关键字:

在数据库中建立索引的作用是