ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

数据库索引

2021-04-13 19:29:39  阅读:134  来源: 互联网

标签:Hash 数据库 全文索引 查询 索引 表中 TABLE


索引

什么是索引

参考文献
[1]https://www.cnblogs.com/vicenteforever/articles/1789613.html
[2]http://blog.codinglabs.org/articles/theory-of-mysql-index.html
[3]https://blog.csdn.net/weixin_42099906/article/details/113604033
[4]https://www.cnblogs.com/wxzhe/p/9955534.html
(整合大佬博客,仅供自己学习)

概念
对数据库表中一个或多个列(例如,账户表的账号(ID)列)的值进行排序的结构。

例如一个普通的查询:select * from table where ID = ‘000001’,在没有索引的情况下,查询过程需要遍历整个表,直至ID为’000001’的这一条数据被搜索到,但是如果存在索引之后,可以通过索引来快速地找到这一条数据。

在索引中进行搜索的过程与遍历不同,首先在建立索引时已经使用了一种特殊的算法将其进行排序,然后存储起来,在我们进行查询时,此时的时间复杂度就由O(n)降到了更低,这样就有效地提升了我们的查询效率。

索引的优缺点

优点(加快检索速度,提高查询性能):

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  2. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引的种类

1.普通索引

最基本的索引。
方法一:

CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 

方法二:

ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

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

2.唯一索引

与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值。
方法一:

CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));

方法二:

ALTER TABLE TableName ADD UNIQUE (column_list) 

3.主键索引

不允许有空值,在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位。
方法一:

CREATE TABLE mytable ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(32) , PRIMARY KEY (`id`) );

方法二:

ALTER TABLE test.t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);

主键索引建立的规则是 int类型优于varchar类型,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列。一般会设为 int 而且是 AUTO_INCREMENT自增类型的。

4.组合索引

指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。

最左前缀原则
mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引。

5.全文索引

文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定。

如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column like ‘%xxxx%’ ,这样做会让索引失效,这个时候全文索引就起到作用了。

全文索引通常使用倒排索引来实现。倒排索引同B+树索引一样,也是一种索引结构。它在辅助表中存储了单词与单词自身在一个或多个文档中所在的位置之间的映射。这通常利用关联数组实现,其拥有两种表现形式。

inverted file index, 其表现形式为{单词, 单词所在文档的ID}
full inverted index,其表现形式为{单词,(单词所在文档的ID, 再具体文档中的位置)}

【具体来说就是inverted file index只能根据单词找到对应的文档,而full inverted index不仅能找到对应的文档,还能找到单词在文档中的具体位置】

索引的方式

1.FULLTEXT

即全文索引,目前只有MyISAM引擎支持(MySQL从3.23.23版开始支持全文索引和全文检索)。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。在数据量较大时候,将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。
使用方法:

ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);
SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE );

其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。
布尔模式:允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,和正则类似;
自然语言模式:就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。

2. HASH

HASH是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。

为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据。

由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。

缺点

  1. Hash 索引仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询。
    由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。
  2. Hash 索引无法被用来避免数据的排序操作。
    由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
  3. Hash 索引不能利用部分索引键查询。
    对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
  4. Hash 索引在任何时候都不能避免表扫描。
    前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
  5. Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
    对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

3.BTREE

BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。

4.RTREE

RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找.

标签:Hash,数据库,全文索引,查询,索引,表中,TABLE
来源: https://blog.csdn.net/baidu_29727087/article/details/115463481

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有