精华内容
下载资源
问答
  • 索引是对数据库表中一列或多列的值进行排序的一结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库...

    索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。  
       索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。   索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。   在数据库关系图中,您可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。
        可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。   如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。   确定索引的有效性:   检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。   对新索引进行试验以检查它对运行查询性能的影响。   考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。   检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。   检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。

    建立索引的优点:
      1.大大加快数据的检索速度;   
        2.创建唯一性索引,保证数据库表中每一行数据的唯一性;   
        3.加速表和表之间的连接;   
        4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

    索引类型:
      根据数据库的功能,可以在数据库设计器中创建四种索引:唯一索引、非唯一索引、主键索引和聚集索引。 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。  

    唯一索引:   
    唯一索引是不允许其中任何两行具有相同索引值的索引。   当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。     

    非唯一索引:   
    非唯一索引是相对唯一索引,允许其中任何两行具有相同索引值的索引。   当现有数据中存在重复的键值时,数据库是允许将新创建的索引与表一起保存。这时数据库不能防止添加将在表中创建重复键值的新数据。     

    主键索引:   
    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。   在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 

    聚集索引(也叫聚簇索引):
    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。   如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

    展开全文
  • Mysql几种索引类型的区别及适用情况

    万次阅读 多人点赞 2013-07-30 18:39:38
    如大家所知道的,Mysql目前主要以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER...

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

    那么,这几种索引有什么功能和性能上的不同呢?

    FULLTEXT

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

    全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。

    全文索引的使用方法并不复杂:

    创建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里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。

    对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。

    HASH

    Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。额,我好像扯远了-_-!

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

    在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

     

    愚安我稍作补充,讲一下HASH索引的过程,顺便解释下上面的第4,5条:

    当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件:

    hash值  存储地址    
    1db54bc745a177#45b5 
    4bca452157d476#4556,77#45cc…

    hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。

    这样,当我们进行WHERE age = 18 时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得数据

    所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),数据量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。

    BTREE

    BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。

    BTREE在MyISAM里的形式和Innodb稍有不同

    在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息.

    而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息.

    RTREE

    RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。

    相对于BTREE,RTREE的优势在于范围查找.

    各种索引的使用情况

    (1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性

    (2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。

    (3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。

    (4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。

    (5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下!


    <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
    展开全文
  • Mysql索引有几种类型

    万次阅读 2019-02-27 10:35:15
    索引是一将数据库中单列或者多列的值进行排序的结构。应用索引可以大幅度提高查询的速度。 用户通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载。用户查询数据时,系统可以不必遍历表中的所有...

    索引是一种将数据库中单列或者多列的值进行排序的结构。应用索引可以大幅度提高查询的速度。

    用户通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载。用户查询数据时,系统可以不必遍历表中的所有记录,而是查询索引列。

    但是,凡事都有双面性。对于依赖关系的子表和附表之间的联合查询时,使用索引可以提高查询速度,并且可以提高整体的系统性能。但是创建索引和维护需要耗费时间,并且该耗费时间与数据量的大小成正比;另外,索引需要占用物理空间,给数据的维护造成很多麻烦。

    整体来说,索引可以提高查询的速度,但是会影响用户操作数据库的插入操作。因为向右索引的表中插入记录时,数据库系统会按照索引进行排序。所以,用户可以将索引删除后,插入数据,当数据插入操作完成后可以重新创建索引。

     

    正题:MySQL索引分类

    MySQL索引包括普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

    1、普通索引

    即不应用任何限制条件的索引,该索引可以在任何数据类型中创建。字段本身的约束条件可以判断其值是否为空或唯一。

    2、唯一索引

    使用UNIQUE参数可以设置唯一索引。创建该索引时,索引的值必须唯一。主键是一种特殊唯一索引。

    3、全文索引

    使用FULLTEXT参数可以设置全文索引。全文索引只能创建在CHAR、VARCHAR、TEXT类型的字段上。查询数据量较大的字符串类型字段时,使用全文索引可以提高查询速度。注意:全文索引在默认情况下是对大小写字母不敏感的,可以通过使用二进制对索引的列进行排序以执行大小写敏感的全文索引。MySQL中只有MyISAM存储引擎支持全文索引

    4、单列索引

    顾名思义,单列索引值对应一个字段的索引。可以包括上述的三种索引方式。应用该索引的条件只需要保证该索引值对应一个字段即可。

    5、多列索引

    多列索引是在表的多个字段上创建一个索引。该索引只想创建时对应的多个字段,可以通过这几个字段进行查询。要想应用该索引,用户必须使用这些字段中的第一个字段。

    6、空间索引

    使用SPATIAL参数可以设置控件索引。控件索引只能建立在控件数据类型(LINESTRING、POINT、GEOMETRY等)上,这样可以提高系统获取控件数据的效率。MySQL中只有MyISAM存储引擎支持空间索引,且该字段不能为空值。

     

    (存储引擎部分可以参考文章——常用的mysql存储引擎及其特点

    展开全文
  • PostgreSQL中的几种索引类型

    千次阅读 2019-08-07 08:32:25
    索引是增强数据库性能的利器,在检索某些特定行的时候效率会很大提升,postgresql中索引类型丰富,每索引有着不同的应用场景,下面简单介绍一下。 索引类型与场景 BTree   • =, >, >=, <, <=、...

    索引是增强数据库性能的利器,在检索某些特定行的时候效率会有很大提升,postgresql中索引类型丰富,每种索引有着不同的应用场景,下面简单介绍一下。

    索引类型与场景

    BTree
      • =, >, >=, <, <=、排序

    Hash
      • =

    GIN
      • 多值类型(数组、全文检索、枚举、网络地址类型):包含、相交
      • JSON类型
      • 普通类型(通过btree_gin 插件支持):与B-Tree类似
      • 字符串(通过pg_trgm 插件支持):模糊查询、相似查询
      • 多列:任意列组合查询

    GiST
      • 空间类型:方位(上、下、左、右),空间关系(相交、包含),空间距离排序(KNN)
      • 范围数据: =, &&, <@, @>, <<, >>, -|-, &<, and &>
      • 普通类型(通过btree_gist 插件支持):与B-Tree类似,增加空间类型类似操作符
      • 数组类型(通过intarray 插件支持):与GIN类似
      • 多列:任意列组合查询

    SPGiST
      • 平面几何类型:与GiST类似
      • 范围类型:与GiST类似

    RUM
      • 多值类型(数组、全文检索类型):包含、相交、相似排序
      • 普通类型:与B-Tree类似

    BRIN
      • 适合线性数据、时序数据,block ranged index是oracle一体机中才有的功能。
      • 普通类型:与B-Tree类似
      • 空间类型:包含

    Bloom
      • 多列:任意列组合,等值查询
      • 表达式索引
      • 搜索条件为表达式
      • where st_makepoint(x,y) op ?
      • create index idx on tbl ( (st_makepoint(x,y)) );
      • 条件索引(定向索引)
      • 搜索时,强制过滤某些条件
      • where status=‘active’ and col=?
      • create index idx on tbl (col) where status=‘active’;
      • 监控系统例子select x from tbl where temp>60; – 99, 1% 异常数据

    索引特性

     只有B-tree,GiST,GIN和BRIN索引类型支持多列索引。最多可以指定32列。使用最左匹配原则。

     在PostgreSQL当前支持的索引类型中,只有B-tree可以产生排序的输出,当ORDER BY与LIMIT n组合:显式排序将必须处理所有数据以识别前n行,但如果存在与ORDER BY匹配的索引,则可以直接检索前n行,而不扫描其余部分。升序默认null值放在最后,可以使用NULLS FIRST和/或NULLS LAST选项来进行调整。

     PostgreSQL可以为表达式的结果创建索引,但是该索引维护代价太大,因为每当插入或者更新时,表达式都需要重新计算。

     PostgreSQL支持对表中部分数据建立索引,使用部分索引的一个主要原因是避免索引常见值。由于搜索常见值的查询将不会使用索引,所以根本没有必要在索引中保留这些行,这样可以直接排除掉一部分数据,减少了索引的大小,性能更快。

     PostgreSQL支持仅索引扫描,当要查询的目标列都在索引中时,直接使用索引中的键值进行返回,不需要回表操作。

    技术永无止境,加油吧。

    欢迎关注我的公众号:数据库架构之美

    展开全文
  • MySQL几种索引类型的区别和应用

    千次阅读 2019-01-22 11:31:20
    Mysql目前主要以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 全文索引、hash索引、B-Tree索引、RTree(范围索引或空间索引) 这几种索引功能和性能上的区别: FULLTEXT 全文索引,目前只有MyISAM引擎支持...
  • Mysql几种索引类型的区别及适用场景

    千次阅读 2019-06-12 14:13:05
    Mysql几种索引类型的区别及适用情况 - 愚安 - 博客园 ... Mysql几种索引类型的区别及适用... 如大家所知道的,Mysql目前主要以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引...
  • 数据库的五种索引类型

    万次阅读 多人点赞 2019-03-15 21:24:13
    本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设一张表,表的数据10W条数据,其中一条数据是nickname='css',如果要拿这条数据的话需要些的...
  • Mysql目前主要的几种索引类型

    千次阅读 热门讨论 2019-04-23 14:57:50
    索引的作用就类似于书本的目录,新华字典的拼音,偏旁部首的首查字,可以快速的检索到需要的内容,所以当数据达到百万的时候,那么索引就很必要了。 索引优点: 1.大大加快数据的检索速度; 2.创建唯一性索引.....
  • 什么是索引?Mysql目前主要的几种索引类型

    万次阅读 多人点赞 2018-02-27 10:11:16
    一、索引MySQL索引的建立对于MySQL的高效运行是很...单列索引,即一个索引只包含单个列,一个表可以多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,你需要确保该索引是应用在 SQ...
  • 索引几种类型以及索引的优缺点

    千次阅读 2020-04-08 19:41:54
    索引几种类型分别是普通索引、唯一索引、聚集索引、主键索引、全文索引。 唯一索引:在创建唯一索引时要不能给具有相同的索引值。 主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来...
  • 1、单列索引,即一个索引只包含单个列,一个表可以多个单列索引,但这不是组合索引。 2、组合索引,即一个索引包含多个列。 (2)创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子...
  • 数据库索引有几种

    千次阅读 2017-08-29 09:31:44
    https://zhidao.baidu.com/question/306752012277622484.html
  • 索引失效的几种情况

    千次阅读 多人点赞 2021-03-09 16:43:59
    什么时候没用 1.or必全有索引; 2.复合索引未用左列字段; 3.like以%开头; 4.需要类型转换;...索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中or,即使其中部分条件带索引也...
  • MySQL5种索引类型

    千次阅读 2018-12-06 13:36:32
    MySQL目前主要以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二、语句 CREATE TABLE table_name[col_name data type] [unique|fulltext][index|key][index_name](col_name...
  • 索引失效的几种例子

    千次阅读 2017-08-12 23:18:43
    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中or,即使其中条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每...
  • 数据库索引失效的几种情况

    千次阅读 2020-04-20 15:48:08
    一、什么是索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来...二、索引失效的几种情况 1.如果条件中多个字段使用or,即使其...
  • Oracle几种索引?

    千次阅读 2020-02-09 09:43:32
    单列索引与复合索引 单列索引是基于单列所创建的索引,复合索引是基于两列或者多列所创建的索引 唯一索引与非唯一索引 唯一索引索引列值不能重复的索引,非唯一索引索引列可以重复的索引。都允许取 NULL 值,...
  • Oracle中多少种索引类型

    千次阅读 2014-03-08 18:56:57
    Oracle中多少种索引类型? 2013-02-20 13:53逻辑上: Single column 单行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函数索引 Domain 域索引 ...
  • MYSQL数据库四种索引类型介绍

    千次阅读 多人点赞 2020-04-20 18:24:46
    MYSQL数据库四种索引类型 主键索引: 主键是一唯一性索引,但它必须指定为PRIMARY KEY,每个表只能一个主键。 唯一索引: 索引列的所有值都只能出现一次,即必须唯一,值可以为空。 普通索引 : 基本的...
  • 索引用来快速地寻找那些具有特定值的记录,所有的MySQL索引都以B-树的形式保存。如果没有索引,执行查询的时候MySQL必须从第一个记录开始扫描整个...如果表1000个记录,通过索引查找记录至少比顺序扫描记录快100倍。
  • MySQL索引失效的几种场景

    千次阅读 2018-10-27 21:32:08
    我们都知道建立索引能够提高查询效率,那么是不是任何情况下都能提高呢,当然不是的的,下面我们就来列举一些常见的索引失效的场景。 借用上一篇文章的dm_person_info表 在card_code列没加索引的时,查询时间如下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 433,730
精华内容 173,492
关键字:

索引类型有几种