数据库中的索引是什么(索引_数据库)

百科 0 600

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)。

为表创建索引的好处:

通过创建索引,可以在查询的过程中,提高系统的性能。

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

数据库中的索引是什么(索引_数据库)

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

为表创建索引的坏处: 增加了数据库的存储空间。

在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

数据库索引有哪些呢? 索引按逻辑角度分可分为:

1.普通索引:最基本的索引,它没有任何限制。它有以下几种创建方式:

直接创建:

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

注意:如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构创建:

ALTER mytable ADD INDEX [indexName] ON (username(length))

创建表的时候直接指定索引:

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

删除索引:

DROP INDEX [indexName] ON mytable;

2.唯一索引:它与普通索引类似,不同之处:索引列的值必须唯一,但允许有空值,创建时加上关键字UNIQUE。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

直接创建(关键字 UNIQUE):

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

修改表结构时创建(UNIQUE):

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

创建表的时候直接指定唯一索引(UNIQUE):

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length))

);

3.主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

创建表时创建索引:

CREATE TABLE C(

ID INT UNSIGNED NOT NULL auto_increment,

username VARCHAR(16) NOT NULL,

PRIMARY KEY(ID)

);

也可后期追加创建:

alter table mytable add primary key(列名)

4.组合索引:

索引按物理存储角度分可分为:

聚集索引:表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余连续性的记录在物理上一样连续存放。聚集索引的缺点就是修改慢,因为为了使表记录和索引的排列顺序一致,所以在插入记录的时候会对数据页重新排序。

非聚集索引:表记录和索引的排列顺序不一定一致,两种索引都采用B+树的结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表记录的指针。非聚集索引层次多,不会造成数据重排。

索引的创建原则:

在经常需要查询的列上创建索引。

在主键的列上创建索引。

在表连接的列上创建索引,如一些外键,可以加快连接的速度

在限定范围进行搜索的列上创建索引。

在经常需要排序的列上创建索引。

在where子句条件上面的列上创建索引。

查询中很少用到的列不应加索引。

对于那些具有很少数据值的列不应加索引,比如客户表的性别列。

bit数据类型的列不应加索引。

类型是数据量相当大的列不应加索引,如数据类型是text,image。

修改性能的要求远远大于搜索性能时不应加索引。

我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。 事实上, 一个加了主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我认知中的「表」很接近。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构。换句话说,就是整个表就变成了一个索引。没错, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

索引的原理:

想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree。当然, 有的数据库也使用哈希桶作用索引的数据结构 , 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。

在计算机科学中,B树是自平衡树数据结构。其保持数据排序,并允许在对数时间内完成搜索、顺序存取、插入和删除。 B树是二叉搜索树的泛化,其节点可以具有多于两个的子节点。

与自平衡二叉搜索树不同的是,B树针对读取和写入大数据块的系统进行了优化。 B树是外部存储器的数据结构的一个很好的例子。 它通常用于数据库和文件系统。

上图展示了一种可能的索引方式:

左边是数据表,一共有两列七条记录。

最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。

为了加快 Col2 的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针。这样就可以运用二叉查找在 O(log2n) 的复杂度内获取到相应数据。

三阶的 B Tree B+的特性:

1.所有数据都存储在叶子结点的链表中,且链表中的数据都是有序存放的;

2.叶子节点间用指针相连。

3.不可能在非叶子结点命中;

4.非叶子结点相当于是叶子结点的索引,叶子结点相当于是存储数据的数据层;

5.更适合文件索引系统;

B+的性能:等于在数据集合做一次二分查找;

二阶的 B+Tree

B+Tree与B Tree的区别:

B+树只有达到叶子结点才命中。

B-树可以在非叶子结点命中。

B+ 树是可变的 n 元树,通常每个节点具有大量子节点。

B+ 树由根,内部节点和叶组成。根可以是叶或具有两个或更多个子节点的节点。

B+ 树可以被视为B树,其中每个(内部)节点仅包含键(不是键值对),并在其底部附加一层链式的叶子节点。

B +树的主要价值在于存储数据,以便在面向块的存储上下文(特别是文件系统)中进行高效检索。

这主要是因为,与二叉搜索树不同的是,B +树具有非常高的扇出(节点中指向 子节点的指针数,通常大约为100或更多),这减少了在树中查找元素所需的I / O操作数。

B+树索引被广泛应用于数据库、文件系统等场景。顺便说一下,xfs文件系统比ext3/ext4效率高很多的原因之一就是,它的文件及目录索引结构全部采用B+树索引,而ext3/ext4的文件目录结构则采用Linked list, hashed B-tree、Extents/Bitmap等索引数据结构,因此在高I/O压力下,其IOPS能力不如xfs。

PS:部分内容摘自互联网

 游戏 

相关推荐: