精华内容
下载资源
问答
  • 常用的空间索引
    千次阅读
    2017-12-15 18:11:37

    1、 什么是空间索引?

    空间索引是指依据空间对象的位置和形状或空间对象之间的某种空间关系按一定的顺序排列的一种数据结构,其中包含空间对象的概要信息,如对象的标识、外接矩形及指向空间对象实体的指针。空间索引也可以称为空间数据查询,是对存储在介质上的数据位置信息的描述,是用来提高系统对数据获取的效率,也称为空间访问方法(Spatial AccessMethod SAM)作为一种辅助性的空间数据结构,空间索引介于空间操作算法和空间对象之间,它通过筛选作用,大量与特定空间操作无关的空间对象被排除从而提高空间操作的速度和效率

    2、为什么要建立空间索引?

    空间索引的建立是因为人们对依据空间位置来进行查询的要求而产生的。举一个简单的例子,如何根据自己所在位置来查询附近100m的POI(point of interest),比如说景点,餐厅,商场等?你可能会说,这很简单,直接计算位置与所有POI的距离,并保留距离小于100m的POI。但是这种方式实际上是不可取的,因为地球本身并是一个椭圆,这就说明两个物体直接的具体不能直接根据坐标距离来直接开平方,同时这种方法耗时较长,运算的效率低下,而且不能推广,当范围扩大时,这种方式的弊端会更加的明显。

    这时候我们可以想到运用一种索引的方法给数据事先建立好索引,这样我们在查询的时候就可以快速的得到我们所期望的结果。不过,这时候又会出现一个问题,传统的索引方式如果只是应用于经度或者纬度这样的一维空间将会有很好的效果,比如说我想搜索的是武汉某区域的POI,但是运用传统的索引方式,不但给了我武汉的,还有与武汉同一纬度的上海,成都,重庆,甚至是国外的开罗,洛杉矶等,当数据量很大的时候,这种索引的方式效率是非常的低下的。

    于是我们便期待一种更为有效,也更能贴近空间数据的索引方式,我们期待的是快速找出落在某一空间范围的,而不是快速找出落在某纬度或经度范围的POI既然传统的索引不能很好的索引空间数据,我们自然需要一种方法能对空间数据进行索引,也就是空间索引。

    3、常用的空间索引有哪些?

    ①  网格索引网格索引的基本思想是将研究区域按一定规则用横竖线分为小的网格,记录每个网格所包含的地理对象。当用户进行空间查询时,首先计算查询对象所在的网格,然后通过该网格快速查询所选的地理对象。网格索引算法大致分为三类:1.基于固定网格划分的空间索引算法(将一幅地图分割成a*b的固定网格,为落入每个格网内的地图目标建立索引)、2.基于多层次网格的空间索引算法(将一幅地图分割成若干大小相同的小块,将落入该小块内的地图目标存入该小块、块对应的存储区域中,根据需要可以将小块划分成更小的块,建立多级索引)和3.自适应层次网格空间索引算法(其网格大小由各具体的地图目标的外接矩形决定,避免了网格索引中网格划分的人为因素)。

    ②  四叉树索引:类似于网格索引,也是对地理空间进行网格划分,对地理空间递归进行四分来构建四义树,直到自行设定的终止条件(比如每个节点关联图元的个数不超过3个,超过3个,就再四分),最终形成一颗有层次的四叉树。每个叶子节点存储了本区域所关联的图元标识列表和本区域地理范围,非叶子节点仅存储本区域地理范围。由于四叉树的生成和维护比较简单,且当空问数据对象分布比较均匀时,基于四叉树的空问索引可以获得比较高的空间数据插入和查询效率。

    ③  R树家族索引:这是一种面向对象分割技术的索引算法,将空间对象按范围划分,每个节点都对应一个区域和磁盘页,非叶节点的磁盘页中存储着其子节点的区域范围;叶节点的磁盘页中存储着其区域范围内的所有空间对象的外接矩形。1.R树算法(是一种层次数据结构动态索引算法,它是B树在K维空间上的自然扩展,是一种高度平衡树。R树由根节点、中问节点和叶节点三类节点组成,中问节点代表数据集空间中的一个矩形,该矩形包含了所有其他孩子节点的最小外接矩形,叶节点存储的是实际对象的外接矩形。)2. R十树(与R树类似,区别在于R+树中兄弟节点对应的空间区域无重叠,这样就消除了R树划分空间时因允许节点重叠而产生的死区域,减少无效查询次数,提高空间索引的效率,但插入删除操作则效率降低。)

    ④  金字塔索引该方法基于一种特殊的优化高维数据的不均衡分割策略,其原理是先将d维空间分成2d个金字塔,共享数据空间的中心点为顶点,然后再将每个金字塔分割成平行于金字塔基的数据页。金字塔索引结构是将高维数据转化为一维数据,利用B+树进行操作。金字塔索引结构的优点是当处理范围查询时,这种索引结构的性能优于其他的索引结构,而且查询处理效率不会随着维数的增加而降低,但金字塔索引结构的优点是基于均匀数据分布和超立方体查询的,对于那些覆盖数据空间边界的查询不是很理想,而现实世界中的数据很少是服从均匀分布的。

    4、总结

    为了解决空间数据查询与分析的难题,我们引入了空间索引,利用空间索引能够大幅度提高空间操作的效率和速度。在具体如何建立空间索引结构时,我们要根据实际情况和实际需求来建立相对应的空间索引类型,进而帮助我们解决实际问题。

    在高效的空间索引课题中,仍然存在着许多问题有待解决,就目前的实际情况来看,现存的几种不同空间索引类型各有各自的优点和缺点以及其适用的范围,没有那一种索引方式能够解决空间索引领域中的所有问题。

    更多相关内容
  • 这是关于常用空间索引技术的分析的电子书,希望对各位有用
  • 常见的空间索引方法

    万次阅读 多人点赞 2018-05-21 15:51:17
    在谈论空间索引之前,我们必须了解索引的概念。索引是为了提高数据集的检索效率。打个比喻,一本书的目录就是这本书的内容的“索引”,我们查看感兴趣的内容前,通过查看书的目录去快速查找对应的内容,而不是...

            在谈论空间索引之前,我们必须了解索引的概念。索引是为了提高数据集的检索效率。打个比喻,一本书的目录就是这本书的内容的“索引”,我们查看感兴趣的内容前,通过查看书的目录去快速查找对应的内容,而不是一字一句地找我们感兴趣的内容。所以,索引是一种“前人栽树,后人乘凉”的东西。

            空间索引不同于书本“目录”,“目录”对应的书本内容是不变的,而我们讨论的空间索引是根据空间数据的改变而变化的,包括数据的创建、修改、删除等基本操作都会重新建立新的索引。空间数据是含有位置、大小、形状以及自身分布特征等多方面信息的数据,因其数据复杂性,我们需要一种索引去提高检索空间数据集合中空间数据的效率,减少空间数据操作时间。我们把检索空间数据集合的“目录”称作空间索引。

            基础的内容这里不多说,直接介绍常见的空间索引

    综合各种文献资料,把常用空间索引的方法大致分为以下几类:

     

     

    在介绍空间索引方法前,我们先介绍一种经典的索引法——B树索引,并介绍基于B树的索引方法。

     

    基于B树的索引方法

    B树索引

    B树,即二叉搜索树,结构特点:
        1. 所有非叶子节点至多拥有两个子节点(Left和Right);
        2. 所有的节点存储一个关键字;

        3. 非页子节点的左指针指向小于其关键字的子树,右节点指向大于其关键字的子树;

     

    实际的使用B树都是在B树的基础上加上平衡算法,是一种平衡多路查找树,其原理是把数据划分为树状层次索引,每个节点占一个存储块。该树所有的特点是:
        1. 定义任意非叶子子节点最多只有M个子节点,且M>2;
        2. 根节点的子节点数为[2,M];
        3. 除根节点意外的非叶子节点的子节点数为[M/2,M];
        4. 每个节点存放至少M/2-1(取上整)和至多M-1个关键字;(至少两个关键字)
        5. 非叶子节点的关键字个数=指向子节点的指针个数-1;
        6. 非叶子节点的关键字:k[1],k[2]…k[M-1],且k[i]<k[i+1];
        7. 非叶子节点的指针:p[1],p[2]....p[M];其中p[1]指向关键字k[1]的子树,p[M]指向关键字大于K[M-1]的子树,其他p[i]指向关键字属于(K[i-1],K[i])的子树;

        8. 所有叶子节点位于同一层;

     

    R树、R+树、R*树索引
    R树是空间数据索引结构中重要的一种层次结构,目前已成为许多空间索引方法的基础,不少前沿的空间索引都使用到R树或者对R树改良。其构建思想是以最小边界矩形(MBR)递归地对空间数据集的空间按照“面积”规划进行划分。它的特点如下:
        1. R树中非叶子节点代表一个划分的空间区域,即一个矩形空间区域;
        2. R树中的叶子节点包含的矩形区域对应空间对象的MBR;
        R+树主要针对R树中兄弟节点的MBR重叠后,导致空间搜索性能较差的特点提出的。R+树中,兄弟节点之间的MBR不允许重叠,这使得空间搜索的性能较好,但由于在插入和删除时需保证兄弟节点之间的MBR不能重叠,因此R+树的插入和删除操作的效率较低。
        R+树中间节点的所有矩形都是不相交的。如果一个对象的MBR被两个或多个R+树高层节点中的矩形分割,与这些非叶节点中矩形相联系的每个项都有指向这个对象的一个后继叶节点。这样树的高度增加,但搜索操作的性能会大大提高。

        R*树相对R树优化的地方是强制重新插入算法,R树中,插入操作导致节点溢出时,采用分裂的方法进行处理,R*树思路是:当新的空间对象索引项的插入导致节点溢出时,选择部分节点在同层节点间进行调整,以推迟节点分裂,从而达到优化R树整体结构的目的。基于R*树的空间索引算法提高了空间利用率,减少了节点分裂次数,但同时增加了CPU的计算代价。

    基于网格的空间索引

            网格索引的基本思想是将研究区域按一定规则用横竖线分为小的网格,记录每个网格所包含的地理对象。当用户进行空间查询时,首先计算查询对象所在的网格,然后通过该网格快速查询所选的地理对象。网格索引算法大致分为三类:基于固定网格划分的空间索引算法、基于多层次网格的空间索引算法和自适应层次网格空间索引算法。
    基于固定网格的空间索引

        将一幅地图分割成a*b的固定网格,再根据一定的方法将网格编码,为落入每个格网内的地图目标建立索引,这样只需检索原来区域的1/a*b,以达到快速检索的目的。该算法的优点是操作简单,在涉及的数据量不大、不需要进行复杂操作时具有一定的适应性。例如对点对象的检索特点适合使用。

            常用的网格编码方法有行排序、Z排序和Hilbert值排序,其中Hilbert值排序最能反应空间邻近性。因此,基于Hibert曲线分形的算法被广泛应用到空间索引中。

    基于多层次网格的空间索引

        将一幅地图分割成若干大小相同的小块,将落入该小块内的地图目标存入该小块、块对应的存储区域中,根据需要可以将小块划分成更小的块,建立多级索引。该算法的优点是检索的效率比较高,相比于纯粹的网格索引减少了特定的比较次数。但是网格划分的精细程度无法保证最优。对处于网格边缘的对象没有一个很好的解决办法,没有考虑到地图目标的水平与垂直分布对网格划分的影响。

    自适应层次网格空间索引算法

        其网格大小由各具体的地图目标的外接矩形决定,避免了网格索引中网格划分的人为因素。算法的优点是网格划分稳定自动,以各地图目标的外接矩形的大小作为划分依据,避免了重复存储,在存储效率上有一定改善。不足就是算法实现复杂,建立索引前,必须知道各地图目标外界矩形的长、宽,按其面积大小排序;建立索引后,进行插入或删除操作时,涉及的地图目标的外接矩形面积若不是原有面积大小,则需要重新进行排序,效率反而会下降。

     

     

    基于二叉树的空间索引

    四叉树空间索引

            四叉树索引可能是最早的专门为存取空间数据而设计的数据结构,不仅可用于二维变量,也可以用于任意维数。它是二叉树用于二维数据的一种推广。
    四叉树索引,类似于网格索引,也是对地理空间进行网格划分,对地理空间递归进行四分来构建四叉树,直到自行设定的终止条件(比如每个节点关联图元的个数不超过3 个,超过 3 个,就再四分),最终形成一颗有层次的四叉树。它的特点如下
        1. 每个叶子节点存储了本区域所关联的图元标识列表和本区域地理范围;
        2. 非叶子节点仅存储本区域地理范围。

    由于四叉树的生成和维护比较简单,且当空间数据对象分布比较均匀时,基于四叉树的空间索引可以获得比较高的空间数据插入和查询效率。如下两图:

     

    KD树——K近邻算法的实现

            K邻近算法在这里就不提及了,KD树(K维搜索树)是把二叉树推广到多维数据的一种主存数据结构,它是一个K维空间中的平衡二叉树,主要用于存储点数据。在每一个内部节点中,它用一个k-1维的超平面(如二维空间的线)将节点所表示的k维空间分成两个部分,这些超平面在k个可能的方向上交替出现,而且在每一个超平面中至少包括一个点数据。在KD树中查找一个所有维都给定值得对象的处理如同在二叉树中一样,只需在每个内部节点上决定沿哪个走向,直至搜索到叶节点为止。

            假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内,如下图八所示。为了能有效的找到最近邻,kd树采用分而治之的思想,即将整个空间划分为几个小部分。首先,粗黑线将空间一分为二,然后在两个子空间中,细黑直线又将整个空间划分为四部分,最后虚黑直线将这四部分进一步划分。

    6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}构建kd树的具体步骤为:
        1. 确定:split域=x。具体是:6个数据点在x,y维度上的数据方差分别为39,28.63,所以在x轴上方差更大,故split域值为x;
        2. 确定:Node-data = (7,2)。具体是:根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以Node-data域位数据点(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:split=x轴的直线x=7;
        3. 确定:左子空间和右子空间。具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};

            如上算法所述,kd树的构建是一个递归过程,我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。如此便成了下面这样一棵k-d树:

        关于KD的内容很多,我就简单阐述到这里。

     

    KDB树

        KDB树兼有KD树和B树的特性,以B树的方式进行插入和删除,是完全平衡的,且可以进行局部重组,她的主要缺陷是不能保证最小空间利用率。KDB树是B树享多味空间发展的一种形式。它对于多维空间中的点进行索引,具有较好的动态特性,删除和增加地理要素可以很方便地实现。其缺点是不直接支持占据一定空间范围的地理要素,如2维空间中的线和面。

    BSP树

        BSP表示二叉空间分割,BSP树能很好地与空间对象的分布情况相适应,但对一般情况而言,BSP树深度较大,对各种操作均有不利影响。
        它的基本思想是基于这样一个事实,任何平面都可以将空间分割成两个半空间。所有位于这个平面的一侧的点定义了一个半空间,位于另一侧的点定义了另一个半空间。此外,如果我们在任何半空间中有一个平面,它会进一步将此半空间分割为更小的两个子空间。我们可以使用多边形列表将这一过程一直进行下去,将子空间分割得越来越小,直到构造成一个二叉树。在这个树中,一个进行分割的多边形被存储在树的节点,所有位于子空间中的多边形都在相应的子树上。当然,这一规则使用于树中每一个节点。

        假设某多边形的平面投影如图十,在它上面,所有多边形都能映射为直线段

        多边形B所在的平面将空间分割为两个部分,使得多边形D和E位于同一个半空间中,多边形C在另一个半空间中。在这个例子中, 多边形A穿越了两个半空间。接下步骤一和二:

            现在已经将问题分成了两个子问题。我们可以在子树中再次使用上述算法,在左边子树中选择E作为分割多边形,在右边子树中选择A2作为分割多边形。这样,我们将建立图十的BSP树,如图十一步骤2。

            必须注意,任何给定的BSP树都不是唯一的。我们可以对同样的多边形找到多个有效的二叉分割方法。根据我们的选择来进行分割的多边形的顺序,可以得到不同的树。

     

    空间索引方法的比较

     

    新型空间索引

     

        目前,成熟的空间索引包括R树索引、网格索引、四叉树索引等等,在实际运用中具有新算法的空间索引很少,基本都是结合上述的空间索引中的一种或两种以上,融合它们的特点变成新的空间索引。

    PostGis的通用搜索树

     

        数据库对多维数据的存取有两种索引方案,R-Tree和GiST(Generalized Search Tree)简称“通用搜索树”,在PostgreSQL中的GiST比R-Tree的健壮性更好,因此PostGIS对空间数据的索引一般采用GiST实现。

    通用搜索树是一棵平衡树,其特点如下:

     

        1.  除根节点的扇出数在2和M之间外,每个节点的扇出数在kM和M之间,这里2/M<=k<=1/2。常量k称作该树的最小填充因子,M为一个节点可以容纳索引项的最大数目。

        2.  索引项形式为(p,ptr),其中p是用作搜索码的谓词(谓词中可以包含自由变量,只要相应子树中叶节点标识的所有元组能实例化这些变量即可)。在叶节点中,ptr为指向数据库中某一元组的指针;而在非叶结点中,ptr为指向其子树根结点的指针。

        它是一种可扩展的树型索引结构框架。这里的“可扩展”包含 层意思:一是支持数据类型的可扩展性;二是支持查询谓词的可扩展性。

     

    QR树——基于R树与四叉树的空间索引

        从R-树的特征出发,为了提高查找性能,减少索引空间重叠,避免或减少查找分支,而引入索引空间的“四叉树”层次划分方法,将整个索引空间划分为多级子索引空间,然后对每级的子索引空间均采用R-树进行索引。其实质是将一棵“大”的R-树分解成多课“小”的R-树(即一群R-树的集合)将查询尽可能限定在局部空间区域,从而提高查找性能。

    实验证明,与R树相比,QR树以略大的空间开销为代价,换取了更高的性能,且索引目标数越多,QR树的整体性能越好。

     

    HR树——基于Hilbert分形曲线的空间索引

        上文阐述网格索引时,提及到网格编码方式中有一种叫Hilbert值编码方式。空间数据沿着Hilbert曲线的特性编码成为Hilbert码。

        基于Hilbert码的R树建立思想是:先将待索引的空间对象按照最小外包矩形MBR的中心的Hilebert码值进行排序分组,然后按照自底而上的模式生成R树。这种算法可以获得几乎100%的空间利用率,而且查询性能优于会产生节点分裂的R树系列。

     

    展开全文
  • Mysql空间索引

    千次阅读 2021-01-18 18:46:48
    Mysql 空间索引本文主要根据mysql 8.0的文档翻译总结,如果使用的是mysql 5.7版本,可能会有些许差异在涉及LBS的服务开发过程中,经常需要存储地理空间的位置并进行一定计算(附近商家等需求),本文主要介绍mysql对于...

    Mysql 空间索引

    本文主要根据mysql 8.0的文档翻译总结,如果使用的是mysql 5.7版本,可能会有些许差异

    在涉及LBS的服务开发过程中,经常需要存储地理空间的位置并进行一定计算(附近商家等需求),本文主要介绍mysql对于LBS的支持。

    Mysql的空间扩展主要提供一下几个方面的功能:

    表示空间数值的数据类型

    操作空间数值的函数

    空间索引,用于提供访问空间列的速度

    其中前两点对InnoDB,MyISAM,NDB,ARCHIVE等mysql存储引擎都支持,第三点只有对InnoDB和MyISAM的支持,由于InnoDB的支持行锁以及事务的特性,现在基本上已经是默认存储引擎了,所以本文以下内容都默认使用InnoDB。

    创建空间列以及空间索引的语句如下:

    CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326, SPATIAL INDEX(g));

    Mysql空间数据类型

    Mysql的空间数据类型与OpenGIS的数据类型相对应。

    单一几何值的空间数据类型:

    GEOMETRY

    POINT

    LINESTRING

    POLYGON

    其中GEOMETRY可以存储任意类型的集合类型,POINT LINESTRING POLYGON则限制了集合类型

    空间集合数据类型:

    MULTIPOINT

    MULTILINESTRING

    MULTIPOLYGON

    GEOMETRYCOLLECTION

    空间数据类型的表示形式

    Mysql的空间数据有不同表示格式,其中咱能看懂的也就第一种

    Well-known Text Format (WKT)形如 Point(1 1)

    Well-know Binary Format (WKB) 二进制表示,贴下帧结构,自己感受下

    Component

    Size

    Value

    Byte order

    1 byte

    01

    WKB type

    4 bytes

    01000000

    X coordinate

    8 bytes

    000000000000F03F

    Y coordinate

    8 bytes

    000000000000F0BF

    Mysql内部几何存储结构

    就是在WKB的前面加上4个字节来表示SRID,就变成了mysql存储的数据结构

    什么是SRID

    因为上文提到了SRID,这里说下什么是SRID,SR是指Spatial Reference,也就是我们常说的空间参考系,mysql支持卡迪尔坐标系和地理坐标系,其中地理坐标系又有好多种,下面说几种常用的空间参考系

    SRID=0表示一个无限的卡迪尔坐标系平面,且坐标轴上无单位

    SRID=4326表示GPS坐标系

    SRID=3857是web地图投影,就是你在谷歌地图上看到的坐标系

    ALTER TABLE geom ADD position POINT SRID 4326

    Mysql的所有空间坐标系都存在表mysql.st_spatial_reference_system中,这个表是隐藏的,看不见的,但是你可以通过infomation_shcema.st_spatial_reference_system中查看参考系的信息,这个表就是mysql.st_spatial_reference_system的一个视图的实现。

    mysql> select * from information_schema.st_spatial_reference_systems where srs_id=4326;

    +----------+--------+--------------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+

    | SRS_NAME | SRS_ID | ORGANIZATION | ORGANIZATION_COORDSYS_ID | DEFINITION | DESCRIPTION |

    +----------+--------+--------------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+

    | WGS 84 | 4326 | EPSG | 4326 | GEOGCS["WGS 84",DATUM["World Geodetic System 1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278,AUTHORITY["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","4326"]] | NULL |

    +----------+--------+--------------+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+

    1 row in set (0.00 sec)

    SRS的解析是在GIS函数调用后才会去懒加载,并把解析的地理位置定义缓存到数据字典中,以后每次需要SRS的信息时不会重复解析

    操作空间数据

    插入数据

    INSERT INTO geom VALUES (ST_GeomFromText('POINT(1 1)'))

    查询内部数据结构

    SELECT g FROM geom

    查询WKT

    SELECT ST_AsText(g) FROM geom

    查询WKB

    SELECT ST_AsBinary FROM geom

    此外常用的还有ST_X,ST_Y,有需要可以去从手册上查

    空间索引

    mysql的空间索引的数据结构是R树,R树实际上就是多维的B树,B树的数据结构在我的另一篇博客中有介绍,这里就不展开了,说几点在应用的时候需要注意的。

    建立空间索引需要对应列NOT NULL且有具体的SRID,没有SRID属性的列称为非SRID约束,会接收任何SRID坐标系的值,但是优化器不能再这样没有SRID的列上使用空间索引

    空间索引只能建立在空间数据类型上

    如果在不支持空间索引的存储引擎中对非空间列建立索引,则会建立B树索引,可以用于精确查找空间位置,但是不能范围查找(把空间数据列当成字符串去建立索引)

    展开全文
  • 1.MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引。基本的语法格式如下: CREATE TABLE 表名(字段名 数据类型 [完整性约束条件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY ...

    转自:https://blog.csdn.net/tomorrow_fine/article/details/78337735

    1.MySQL在创建数据表的时候创建索引

    在MySQL中创建表的时候,可以直接创建索引。基本的语法格式如下:

    CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
                      [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
                      [索引名](字段名1 [(长度)] [ASC | DESC])
    );
    

    UNIQUE: 可选。表示索引为唯一性索引。
    FULLTEXT; 可选。表示索引为全文索引。
    SPATIAL: 可选。表示索引为空间索引。
    INDEX和KEY: 用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。
    索引名: 可选。给创建的索引取一个新名称。
    字段名1: 指定索引对应的字段的名称,该字段必须是前面定义好的字段。
    长度: 可选。指索引的长度,必须是字符串类型才可以使用。
    ASC: 可选。表示升序排列。
    DESC: 可选。表示降序排列。

    1.1 MySQL创建普通索引

    创建一个普通索引时,不需要加任何UNIQUE、FULLTEXT或者SPATIAL参数。

    实例:创建一个名为index1的数据表,在表内的id字段上建立一个普通索引。

    1. 创建普通索引的SQL代码如下:

    CREATE TABLE index1(id INT,
        name VARCHAR(20),
        sex BOOLEAN,
        INDEX(id)
    ); 
    

    查看MySQL创建普通索引的操作效果。如下图所示:
    在这里插入图片描述
    从上图中可以看出,运行结果显示普通索引创建成功。

    2. 使用SHOW CREATE TABLE语句查看表的结构。如下图所示:
    或者通过1步骤,可以看出,在id字段上已经建立了一个名为id的普通索引。语句:

    KEY `id` (`id`)
    

    圆括号内的id是字段名称,圆括号左侧外面的id是索引名称。

    3. 使用EXPLAIN语句查看索引是否被使用。SQL代码如下:

      EXPLAIN SELECT * FROM index1 WHERE id = 1;
    

    使用EXPLAIN语句查看索引是否被使用的操作效果。如下图所示:
    在这里插入图片描述

    上图中的结果显示,possible_keys和key的值都为id。说明id索引已经存在,并且查询时已经使用了索引。

    1.2 MySQL创建唯一性索引

    如果使用UNIQUE参数进行约束,则可以创建唯一性索引。

    实例:创建一个名为index2的数据表,在表内的id字段上建立一个唯一性索引,并且设置id字段以升序的形式排列。
    1. 创建一个唯一性索引的SQL代码如下:

    CREATE TABLE index2(
    id INT UNIQUE,
    NAME VARCHAR(20),
    UNIQUE INDEX index2_id(id ASC)
    );
    

    index2_id是为唯一性索引起的一个新名字。

    查看MySQL创建唯一性索引的操作效果。如下图所示:
    在这里插入图片描述
    从上图中可以看出,运行结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句查看表的结构。SQL代码如下:

    SHOW CREATE TABLE index2 \G
    在DOS提示符窗口中查看使用SHOW CREATE TABLE语句查看表的结构的效果。也可以通过上面的1步骤看到,在id字段上建立了名为id和index2_id的两个唯一性索引。这样做,可以提高数据的查询速度。

    如果在创建index2表时,id字段没有进行唯一性结束。如下所示:

    CREATE TABLE index2(
    id INT,
    name VARCHAR(20),
    UNIQUE INDEX index2_id(id ASC)
    );
    

    则也可以在id字段上成功创建名为index2_id的唯一性索引。但是,这样可能达不到提高查询速度的目的。

    1.3 MySQL创建全文索引

    全文索引使用FULLTEXT参数,并且只能在CHAR、VARCHAR或TEXT类型的字段上创建。
    全文索引可以用于全文搜索。
    现在,MyISAM存储引擎和InnoDB存储引擎都支持全文索引。
    实例:创建一个名为index3的数据表,在表中的info字段上建立名为index3_info的全文索引。

    1. 创建全文索引的SQL代码如下:

    CREATE TABLE index3(id INT,
    info VARCHAR(20),
    FULLTEXT INDEX index3_info(info)
    )ENGINE=MyISAM;
    

    如果设置ENGINE=InnoDB,则可以在InnoDB存储引擎上创建全文索引。

    查看MySQL创建全文索引的操作效果。如下图所示:
    在这里插入图片描述

    从上图中可以看出,代码的执行结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句查看index3数据表的结构。如下图所示:
    从上图中可以看出,在info字段上已经建立了一个名为index3_info的全文索引。
    注意
    我使用的是MySQL 5.6.19版本,已经可以在InnoDB存储引擎中创建全文索引了。

    全文索引非常适合于大型数据集,对于小的数据集,它的用处可能比较小。

    1.4 MySQL创建单列索引

    单列索引是在数据表的单个字段上创建的索引。一个表中可以创建多个单列索引。唯一性索引和普通索引等都为单列索引。

    实例:创建一个名为index4的数据表,在表中的subject字段上建立名为index4_st的单列索引。

    1. 创建单列索引的SQL代码如下:

    CREATE TABLE index4(
    id INT,
    subject VARCHAR(30),
    INDEX index4_st(subject(10))
    );
    

    查看MySQL创建单列索引的操作效果。如下图所示:
    在这里插入图片描述

    从上图中可以看出,代码执行的结果显示创建成功。

    2. 使用SHOW CREATE TABLE语句 或 manage index 查看index4数据表的结构。如下图所示:
    在这里插入图片描述

    从上图中可以看出,在subject字段上已经建立了一个名为index4_st的单列索引。

    注意:subject字段长度为30,而index4_st设置的索引长度只有10,这样做是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,而只查询它前面的若干字符信息。

    1.5 MySQL创建多列索引

    创建多列索引是在表的多个字段上创建一个索引。

    实例:创建一个名为index5的数据表,在表中的name和sex字段上建立名为index5_ns的多列索引。

    1. 创建多列索引的SQL代码如下:

    CREATE TABLE index5(id INT,
    name VARCHAR(20),
    sex CHAR(4),

    INDEX index5_ns(name,sex)

    );
    在DOS提示符窗口中或可视化工具中查看MySQL创建多列索引的操作效果。如下图所示:
    在这里插入图片描述

    从上图中可以看出,代码的执行结果显示index5_ns索引创建成功。

    从上图中可以看出,name和sex字段上已经建立了一个名为index5_ns的多列索引。

    2. 多列索引中,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

    先在index5数据表中添加一些数据记录,然后使用EXPLAIN语句可以查看索引的使用情况。如果只是使用name字段作为查询条件进行查询。如下图所示:
    在这里插入图片描述

    EXPLAIN SELECT id,NAME,sex FROM index5;
    

    在这里插入图片描述

    EXPLAIN SELECT id,NAME,sex FROM index5 WHERE id = 3;
    在这里插入图片描述

    在这里插入图片描述

    从上图中可以看出,possible_keys和key的值都是index5_ns。Extra(额外信息)显示正在使用索引。这说明使用name字段进行索引时,索引index5_ns已经被使用。

    4. 如果只使用sex字段作为查询条件进行查询。如下图所示:

    EXPLAIN SELECT id,NAME,sex FROM index5 WHERE sex = '女';
    

    在这里插入图片描述

    从上图中可以看出,possible_keys和key的值都是NULL。Extra(额外信息)显示正在使用where条件查询,而未使用索引。

    提示

    使用多列索引时一定要特别注意,只有使用了索引中的第一个字段时才会触发索引。如果没有使用索引中的第一个字段,那么这个多列索引就不会起作用。因此,在优化查询速度时,可以考虑优化多列索引。

    1.5 MySQL创建空间索引

    使用SPATIAL参数能够创建空间索引。创建空间索引时,表的存储引擎必须是MyISAM类型。而且,索引字段必须有非空约束。

    实例:创建一个名为index6的数据表,在表中的space字段上建立名为index6_sp的空间索引。

    1. 创建空间索引的SQL代码如下:

    CREATE TABLE index6
    (
    id INT,
    SPACE GEOMETRY NOT NULL,
    SPATIAL INDEX index6_sp(SPACE)
    ) ENGINE=MYISAM;
    

    在DOS提示符窗口中或可视化工具中查看MySQL创建空间索引的操作效果。如下图所示:
    在这里插入图片描述

    从上图可以看出,代码执行的结果显示空间索引创建成功。

    1. 使用SHOW CREATE TABLE语句可看index6数据表的结构。如下图所示:
      从上图中可以看出,在space字段上已经建立了一个名为index6_sp的空间索引。从上图中可以看出,在space字段上已经建立了一个名为index6_sp的空间索引。

    注意,space字段是非空的,而且数据类型是GEOMETRY类型。这个类型是空间数据类型。

    空间数据类型包括GEOMETRY、POINT、LINESTRING和POLYGON类型等。这些空间数据类型平时很少用到

    2 添加索引

    1.添加PRIMARY KEY(主键索引)
    mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column )
    2.添加UNIQUE(唯一索引)
    mysql>ALTER TABLE table_name ADD UNIQUE (
    column
    )
    3.添加INDEX(普通索引)
    mysql>ALTER TABLE table_name ADD INDEX index_name ( column )
    4.添加FULLTEXT(全文索引)
    mysql>ALTER TABLE table_name ADD FULLTEXT ( column)
    5.添加多列索引
    mysql>ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

    3 建立索引常用的规则

    转:https://www.cnblogs.com/JimLy-BUG/p/6812682.html
    建立索引常用的规则如下:
    1、表的主键、外键必须有索引;
    2、数据量超过300万的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,非凡是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上(枚举型字段不建索引);
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
    A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
    B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?假如是,则可以建立复合索引;否则考虑单字段索引;
    C、假如复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
    D、假如复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
    E、假如既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响;
    以上是一些普遍的建立索引时的判定依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,凡是对频繁更新的表来说,负面影响更大

    展开全文
  • 对MR-tree进行邻近关系信息的存储扩充,引入Voronoi图构建VoMR-tree索引。同时,提出了一种基于VoMR-tree的空间查询算法,讨论了...实验结果表明,所提出的算法在执行时间和占用存储空间上都优于常用空间索引方法。
  • PostGIS教程十一:空间索引

    万次阅读 多人点赞 2019-01-11 14:39:28
    一、空间索引是怎样工作的? 二、纯索引查询 三、分析 四、清理(VACUUM) 五、相关函数 回想一下,空间索引是空间数据库的三个关键特性之一。空间索引使得使用空间数据库存储大型数据集成为可能。在没有空间...
  • MySQL数据库的常用索引

    千次阅读 多人点赞 2020-05-24 23:47:26
    本文关键字:数据库、MySQL、索引的作用、常用索引。在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。
  • 在分析各种常用索引的基础上,依据各自的适用范围,提出了对点对象建立格网索引,对线、面对象建立改进四叉树索引的组合优化策略。设计的改进四叉树索引避免了传统四叉树的重复索引,提高了数据访问的效率。
  • 索引常用的数据结构

    2021-12-12 00:22:19
    一文看懂索引常用的数据结构:Hash表、B-Tree、B+Tree。mysql为什么使用B+Tree
  • mysql常用四种索引类型

    千次阅读 2022-04-01 21:33:01
    唯一索引 (UNIQUE Indexs) 要求索引列的所有值都只能出现一次,即必须唯一。 普通索引 (Normal index) 仅用来提高查询速度,没有其他特性。 全文索引 (FULLTEXT Indexes) MySQL可以通过建立全文
  • mysql 常用索引类型

    千次阅读 2021-01-19 08:26:59
    一、索引的类型mysql索引的四种类型:主键索引、唯一索引、普通索引和全文索引。通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化时mysql中的一种优化方式。索引的作用相当于图书...
  • 点云数据主要是表征目标表面的海量点集合,并不具备传统实体网格数据的几何拓扑信息。点云处理中最核心的问题就是建立离散点间的拓扑...实现基于邻域关系的快速查找,划分空间索引结构主要有:k-d tree,八叉树。...
  • PostgreSQL常用索引

    千次阅读 2021-09-22 10:20:32
    索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。postgresql里的所有索引都是“从属索引”,也...
  • R*-树空间索引的改进

    2011-05-03 12:12:18
    为了克服R*树在时间与效率上的不足 给出了一种新型的存储结构,并给出了这种存储结构的插入、溢出、分裂等空间索引常用操作的算法
  • C++常见空间索引效率对比

    千次阅读 2014-09-09 20:30:59
    空间数据至少是二维数据,常用的一维索引(如BTree/Bitmap索引等)无法满足需求,常用空间索引算法有BSP树、K-D-B树、R树、R+树和CELL树(摘自百度百科,补充四叉树)。 本文要对比的是一些常见的C++空间索引...
  • 摘 要:介绍了常用空间索引算法,对其性能进行了比较,认为这些算法用于需要动态更新空间索引结构的移动GIS系统中时具有较大的局限性。针对移动GIS系统中对空间索引的特殊要求,提出了动态四叉树空间索引算法,对...
  • 空间数据索引RTree完全解析

    万次阅读 多人点赞 2018-03-13 21:25:45
    空间数据的背景介绍空间数据的建模基于实体的模型(基于对象)Entity-based models (or object based)常用空间数据查询方式空间数据获取的方法R树简介R树的数据结构一个更具体的使用场景一棵R树满足如下的性质:...
  • 在谈论空间索引之前,我们必须了解数据索引的概念:索引是为了提高数据集的检索效率。打个比喻,一本书的目录就是这本书的内容的“索引”,我们查看感兴趣的内容前,通过查看书的目录去快速查找对应的内容,而不是...
  • Oracle中的索引详解(整理)

    千次阅读 2021-05-04 08:51:04
    3、 优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多 4、 语法:CREATE BITMAP INDEX index ON table (column[, column]...); 5、 掩饰: create table bitmaptable as select * from index...
  • 在介绍空间索引之前,先谈谈什么叫“索引“。对一个数据集做”索引“,是为了提高对这个数据集检索的效率。书的”目录“就是这本书内容的”索引“,当我们拿到一本新书,想查看感兴趣内容的时候,我们会先查看目录,...
  • Oracle 表 空 间 和 用户操作,常用命令,索引常规应用
  • MySQL四种常用索引类型

    千次阅读 2017-09-01 11:00:18
    提到MySQL优化,索引优化是必不可少的。其中一种优化方式 ——索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升。 我们知道项目性能的瓶颈主要是在”查(select)”语句,要提升”查”这一性能...
  • 为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢? ...
  • 数据库建立索引常用的规则

    千次阅读 2019-08-01 19:04:11
    数据库建立索引常用的规则如下: 1、表的主键、外键必须有索引;  2、数据量...
  • 常见索引类型

    千次阅读 2021-02-15 15:44:17
    日常开发工作中,涉及到的数据存储,要做查询优化或想深入了解存储引擎,需要对索引知识有个起码的了解,下面介绍下最常见的四种索引结构。 位图索引 哈希索引 BTREE索引 倒排索引 1、位图索引(BitMap) 位图...
  • MySql索引类型

    万次阅读 2018-07-04 22:15:19
    Mysql支持哪几种索引索引是在MySql的存储引擎层中实现的,而不是在服务器层从数据结构角度1、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理BTREE在MyISAM里的形式和Innodb稍有...
  • 一文搞懂MySQL索引所有知识点(建议收藏)

    万次阅读 多人点赞 2020-10-24 12:19:05
    空间索引 MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。 前缀索引 在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的...
  • 空间索引初探

    2012-03-20 17:20:58
    空间索引初探 ---by wangsh 2012-03-20    本文简单介绍了GIS分析中常用... 本文主要介绍包含格网索引、四叉树、k-d Tree、R-Tree等常用空间索引。   参考 1. Libspatialindex http://libspatialindex.git
  • GIS空间索引技术

    千次阅读 2011-01-18 13:11:00
    常用空间索引技术介绍和比较:  网格空间索引、四叉树空间索引和R树系列空间索引最为常见。    目前国内外主要的空间数据库也大都采用网格空间索引、四叉树 与 R树 这三类的空间索引结构...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,486
精华内容 109,394
关键字:

常用的空间索引