数据库之索引

181 阅读4分钟

数据库索引的定义以及好处:

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。

大大加快数据的检索速度,这也是创建索引的最主要的原因;

加速表和表之间的连接;

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

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

3). 什么情况下设置了索引但无法使用?

以“%(表示任意0个或多个字符)”开头的LIKE语句,模糊匹配;(与B+ Tree的结构有关但是如果是aaa后面再跟就可以用索引了,因为是根据这个key进行排序的但是如果这个东西在中间就不行了)

OR语句前后没有同时使用索引;

数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型);

4). 什么样的字段适合创建索引?

经常作查询选择的字段

经常作表连接的字段

经常出现在order by, group by, distinct 后面的字段

5). 索引的缺点

时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;

空间方面:索引需要占物理空间。

6). 索引类别

1,普通索引:

实例:CREATE INDEX index_name on table_name (col_name);

ALTER TABLE table_name ADD INDEX index_name(col_name);

2,唯一索引:

实例:CREATE UNIQUE INDEX index_name on table (col_name);

ALTER TABLE table_name ADD UNIQUE(col_name);

表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。唯一性索引中可以有空值NULL。

3,主键索引:

实例:ALTER TABLE table_name ADD PRIMARY KEY(col_name);

4,聚集索引:

CREATE CLUSTER INDEX index_name on table (col_name);

在聚簇索引中,聚簇索引的顺序就是数据的物理存储顺序。因此一个表只能存在一个聚集索引。

关于主键索引和聚集索引

(1)如果表定义了PK,则PK就是聚集索引;

(2)如果表没有定义PK,则第一个not NULL unique列是聚集索引;

(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索

5,全文索引:

ALTER TABLE table_name ADD FULLTEXT(col_name);

CREATE FULLTEXT INDEX index_name on table (col_name);

本质是分词以后方便模糊匹配,比如一篇文章某个地方存在aaa,我想找到所有含有aaa字段的文章就可以使用全文索引。

关于全文索引这一篇文章讲的比较好,不再赘述。

www.360doc.com/content/17/…

6.倒排索引(Invert Index)

一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。

而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档。

7.联合索引

指的是对多个列建立索引。联合索引遵从最左原则。

CREATE INDEX index_name on table (col_name1,col_name2,col_name3);

实际上会建立 col1;col1, col2; col1,col2,col3; 三种索引出来。出现这种情况的原因是在建立联合索引时会先按照col1建立索引,当col1值相同时再比较col2,当col2相同时再比较col3。值得注意的是查询时候的where不会影响查询器使用索引的决策。即使我查询的是先col2再col1,查询器也会走col1,col2的索引

在联合索引的过程中存在一个叫做覆盖索引的优化。具体指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。避免了回表操作。

PS:什么是回表操作。除了cluster index(聚集索引)的B+ Tree的叶子节点中是直接存的是一行数据外,普通索引的节点内容则是cluster index中key的值。也就是说普通索引查询需要访问两次。第一次访问的是普通索引的B+ Tree然后得到聚集索引的key然后再访问聚集索引的B+ Tree获得真正的数据。访问的第二次B+Tree则是回表操作。见图。

![](https://upload-images.jianshu.io/upload_images/23475747-bf4f31e789c82cef.png?imageMogr2/auto-orient/strip|imageView2/2/w/459/format/webp)

数据库索引实现的方式:hash table 索引, B+ Tree索引。经常使用的为B+ Tree索引。优点见B+ Tree优点总结。

0人点赞
[日记本](https://www.jianshu.com/nb/45913422)