精华内容
下载资源
问答
  • 下列关于文件索引结构的叙述中,哪些是正确的? 正确答案: A B C 你的答案: B C (错误) 系统为每个文件建立一张索引表 采用索引结构会引入存储开销 从文件控制块中可以找到索引表或索引表的...

    下列关于文件索引结构的叙述中,哪些是正确的?

    正确答案: A B C   你的答案: B C (错误)

    系统为每个文件建立一张索引表
    采用索引结构会引入存储开销
    从文件控制块中可以找到索引表或索引表的地址
    采用索引结构,逻辑上连续的文件存放在连续的物理块中


    索引结构指一个文件的信息存放在若干不连续的物理块中,系统为每个文件建立一个专用的数据结构——索引表,并将这些块的块号存放在索引表中。有点是保留了链接结构的优点,同时解决了其缺点,即能顺序存取,又能随机存取,满足了文件动态增长,插入删除的需求,也能充分利用外存空间。缺点是索引表本身带来的系统开销。


    为了提高文件的检索效率,可以采用索引方法组织文件。采用索引这种结构,逻辑上连续的文件可以存放在若干不连续的物理块中,但对于每个文件,在存储介质中除存储文件本身外,还要求系统另外建立一张索引表,索引表记录了文件信息所在的逻辑块号和与之对应的物理块号。索引表也以文件的形式存储在存储介质中,索引表的物理地址则由文件说明信息项给出。


        在很多情况下,有的文件很大,文件索引表也就较大。如果索引表的大小超过了一个物理块,可以采用间接索引(多重索引),也就是在索引表所指的物理块中存放的不是文件信息,而是装有这些信息的物理块地址。这样,如果一个物理块可装下n个物理块地址,则经过一级间接索引,可寻址的文件长度将变为n×n块。如果文件长度还大于n×n块,还可以进行类似的扩充,即二级间接索引。


        不过,大多数文件不需要进行多重索引,也就是说,这些文件所占用的物理块的所有块号可以放在一个物理块内。如果对这些文件也采用多重索引,则显然会降低文件的存取速度。因此,在实际系统中,总是把索引表的头几项设计成直接寻址方式,也就是这几项所指的物理块中存放的是文件信息;而索引表的后几项设计成多重索引,也就是间接寻址方式。在文件较短时,就可利用直接寻址方式找到物理块号而节省存取时间。


        索引结构既适用于顺序存取,也适用于随机存取,并且访问速度快,文件长度可以动态变化。索引结构的缺点是由于使用了索引表而增加了存储空间的开销。另外,在存取文件时需要至少访问存储器两次以上,其中,一次是访问索引表,另一次是根据索引表提供的物理块号访问文件信息。由于文件在存储设备的访问速度较慢,因此,如果把索引表放在存储设备上,势必大大降低文件的存取速度。一种改进的方法是,当对某个文件进行操作之前,系统预先把索引表放入内存,这样,文件的存取就可直接在内存通过索引表确定物理地址块号,而访问存储设备的动作只需要一次。当文件被打开时,为提高访问速度将索引表读入内存,故又需要占用额外的内存空间。


    展开全文
  • 摘要:本文章先描述了常用的索引,并针对B-tree和Psort两种索引具体介绍,下面给出索引的利与弊。除了索引,还介绍了分区、PCK等其他查询提速的手段。最后给出各种索引和调优手段的使用场景。

    本文分享自华为云社区《DWS 索引的正确“打开姿势”》,原文作者:hoholy 。

    索引能干什么呢,一言以蔽之:查询加速。常见的索引有下面几种:

    1. 常用索引介绍

    1.1 B-btree索引

    B-tree存储结构示意如下:

    • B-tree是平衡树,有序存储索引KEY值和TID;
    • 对于索引上的过滤条件,通过KEY快速找到对应的叶子节点,然后再通过TID找到实际记录;
    • 索引中的数据以非递减的顺序存储(页之间以及页内都是这种顺序),同级的数据页由双向链表连接;
    • 支持单列索引和复合(多列)索引,多列复合索引适用于多列组合查询,B-tree索引对于查询条件的顺序有要求;
    • B-tree索引可以处理等值和范围查询;
    • 索引页面不存储事务信息;

    在数据库里面举个例子,如何创建B-tree索引:

    1.2 Psort索引

    Psort索引数据结构示意如下图所示:

    • Psort索引本身是个列存表,包含索引列和tid,在索引列上局部排序,利用MIN/MAX块过滤加速TID获取;
    • Psort索引本身有可见性,但删除、更新数据不会作用到Psort索引;
    • Psort索引更适合做范围过滤,点查询速度较差;
    • 批量导入场景下有效,对于单条导入无效;

    横向对比B-tree、Psort如下:

    1.3 特殊索引

    • 表达式索引

    比如对于查询“select * from test1 where lower(col1) = ‘value’;”可以建立在Lower表达式之上的索引“create index on test1(lower(col1));”,后续对于类似在lower(col1)表达式上的过滤条件,就可以直接使用这个索引加速,对于其他表达式该索引不会对查询生效。但需要注意的是:索引表达式的维护代价较为昂贵,因为在每一个行被插入或更新时都得为它重新计算相应的表达式。

    • 部分索引

    比如创建一个部分索引“create index idx2 on test1(ip) where not (ip > ’10.185.178.100’ and ip < ’10.185.178.200’);”,使用该缩影加速的典型查询是这样“select * from test1 where ip = ’10.185.178.150’”,但是对于查询“select * from test1 where ip = ’10.185.178.50’”就不能使用该索引。部分索引用来减少索引的大小,排除掉查询不感兴趣的数据,同时可以加速索引的检索效率.

    • 唯一索引

    (1)只有B-tree索引支持唯一索引;

    (2)当一个索引被声明为唯一时,索引中不允许多个表行具有相同的索引值;

    (3)空值被视为不相同,一个多列唯一索引将会拒绝在所有索引列上具有相同组合值的表行;

    (4)对于主键列会自动创建一个唯一索引;

    (5)唯一性检查会影响索引插入性能;

    1.4 索引的利与弊

    索引的优点如下:

    • 点查询提速显著,直接定位到需要的位置,减少无效IO;
    • 多条件组合查询,过滤大量数据,缩小扫描范围;
    • 利用倒排索引加速全文检索;
    • 利用等值条件索引查询速度快的优势,结合nestloop提高多表join效率;
    • 提供主键和唯一性约束,满足业务需要;
    • 利用btree索引天然有序的特点,优化查询计划;

    索引的缺点如下:

    • 索引页面占用额外空间,导致一定的磁盘膨胀;
    • 每次数据导入同时需要更新索引,影响导入性能;
    • 索引页面没有可见性,存在垃圾数据,需要定期清理;
    • 索引扫描性能并不总是比顺序扫描性能更好,一旦优化器判断有误,可能导致查询性能反向劣化;
    • 索引需要记录XLOG,增加日志量;
    • 每个索引至少一个文件,增加备份恢复、扩容等操作的代价;

    鉴于索引的使用是一把双刃剑,创建索引要谨慎,只给有需要的列创建,不能过滤大量数据的条件列不要创建索引。除了索引可以优化查询效率,存储层还有没有其他优化手段呢?下面给大家再介绍几种DWS查询提速的手段。

    2. DWS查询提速

    2.1 分区

    分区是最常用的提速手段之一,而且效果很好,推荐大家结合场景多多使用。

    • 目前支持的分区是range分区,分区支持merge、split、exchange等操作;
    • 在时间维度或者空间维度等具有一定数据规律的列上创建分区,分区列上的过滤条件会先做分区剪枝,减少物理扫描量;
    • 相比较索引,分区直接把原始数据物理划分,一旦分区剪枝生效,会极大的减少IO;
    • 使用分区和使用索引并不冲突,可以给分区创建索引;

    使用分区的注意事项如下:

    • 分区对于导入的影响是增加内存使用(内存不足时会下盘),但不产生额外的磁盘占用;
    • 使用分区一定要注意分区列的选择和分区数量的控制,分区过多会导致小文件问题,分区数量建议最多不超过1600个;
    • 分区剪枝适合范围查询,对于点查询效率提升有限;

    下面举个例子,分别创建同样数据类型的分区表和非分区表,导入相同的数据640万条,用同样的查询会看到分区剪枝对性能提高了7倍多,准备数据:

    分区和非分区查询耗时对比,其中test1是分区表,test2是非分区表,test1的查询scan耗时6ms,test2的查询scan耗时46ms,差距7倍还多:

    2.2 PCK(partial cluster key)

    PCK的本质就是通过排序提升查询过滤的效率,创建表时指定PCK列,该列上的数据会局部排序,有序的数据带来更好的数据聚簇性,每个数据块的min/max等稀疏索引就能更好的发挥作用,粗过滤掉大量的数据,提升IO效率,默认情况下420万行数据局部排序。

    注意事项如下:

    • 只有列存表支持PCK,局部排序对每次导入的批量数据生效,不会做全排序;
    • PCK更适用于范围查询,点查场景下配套使用PCK和索引可以达到最佳效果;
    • 带PCK导入因为排序的原因会使用更多的内存,影响导入速度,需要权衡导入和查询性能;

    举个例子,对于查询select * from tab where col > 65,如果不使用PCK,很可能一个CU都无法过滤掉,但如果使用了PCK,下图所示的5个CU就能过滤掉一半还多,提升查询性能至少50%:

    再用上面分区的那组数据横向对比PCK的性能表现:

    (1)列存表,非分区,无PCK,scan耗时46ms

    (2)列存表,非分区,有PCK,scan耗时1.7ms

    (3)列存表,有PCK,再创建btree索引,scan耗时0.1ms

    PCK结合索引,可以将类似这种点查的性能提升100倍以上。

    2.3 智能过滤

    列存表数据从文件读出来,到反馈给执行层,中间会智能识别自动多层过滤,对用户完全透明,如下图所示:

    3. 索引使用场景推荐

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • MySQL查询索引正确使用

    万次阅读 2015-05-17 14:32:12
    当然还有其它的一些技术可供使用,但是一般来说引起最大性能差异的都是索引正确使用。在MySQL邮件列表中,人们经常询问那些让查询运行得更快的方法。在大多数情况下,我们应该怀疑数据表上有没有索引,并且通常在...

    索引是提高查询速度的最重要的工具。当然还有其它的一些技术可供使用,但是一般来说引起最大性能差异的都是索引的正确使用。在MySQL邮件列表中,人们经常询问那些让查询运行得更快的方法。在大多数情况下,我们应该怀疑数据表上有没有索引,并且通常在添加索引之后立即解决了问题。当然,并不总是这样简单就可以解决问题的,因为优化技术本来就并非总是简单的。然而,如果没有使用索引,在很多情况下,你试图使用其它的方法来提高性能都是在浪费时间。首先使用索引来获取最大的性能提高,接着再看其它的技术是否有用。

      这一部分讲述了索引是什么以及索引是怎么样提高查询性能的。它还讨论了在某些环境中索引可能降低性能,并为你明智地选择数据表的索引提供了一些指导方针。在下一部分中我们将讨论MySQL查询优化器,它试图找到执行查询的效率最高的方法。了解一些优化器的知识,作为对如何建立索引的补充,对我们是有好处的,因为这样你才能更好地利用自己所建立的索引。某些编写查询的方法实际上让索引不起作用,在一般情况下你应该避免这种情形的发生。

      索引的优点

      让我们开始了解索引是如何工作的,首先有一个不带索引的数据表。不带索引的表仅仅是一个无序的数据行集合。例如,图1显示的ad表就是不带索引的表,因此如果需要查找某个特定的公司,就必须检查表中的每个数据行看它是否与目标值相匹配。这会导致一次完全的数据表扫描,这个过程会很慢,如果这个表很大,但是只包含少量的符合条件的记录,那么效率会非常低。


    1:无索引的ad


      图2是同样的一张数据表,但是增加了对ad表的company_num数据列的索引。这个索引包含了ad表中的每个数据行的条目,但是索引的条目是按照company_num值排序的。现在,我们不是逐行查看以搜寻匹配的数据项,而是使用索引。假设我们查找公司13的所有数据行。我们开始扫描索引并找到了该公司的三个值。接着我们碰到了公司14的索引值,它比我们正在搜寻的值大。索引值是排过序的,因此当我们读取了包含14的索引记录的时候,我们就知道再也不会有更多的匹配记录,可以结束查询操作了。因此使用索引获得的功效是:我们找到了匹配的数据行在哪儿终止,并能够忽略其它的数据行。另一个功效来自使用定位算法查找第一条匹配的条目,而不需要从索引头开始执行线性扫描(例如,二分搜索就比线性扫描要快一些)。通过使用这种方法,我们可以快速地定位第一个匹配的值,节省了大量的搜索时间。数据库使用了多种技术来快速地定位索引值,但是在本文中我们不关心这些技术。重点是它们能够实现,并且索引是个好东西。


    2:索引后的ad


      你可能要问,我们为什么不对数据行进行排序从而省掉索引?这样不是也能实现同样的搜索速度的改善吗?是的,如果表只有一个索引,这样做也可能达到相同的效果。但是你可能添加第二个索引,那么就无法一次使用两种不同方法对数据行进行排序了(例如,你可能希望在顾客名称上建立一个索引,在顾客ID号或电话号码上建立另外一个索引)。把与数据行相分离的条目作为索引解决了这个问题,允许我们创建多个索引。此外,索引中的行一般也比数据行短一些。当你插入或删除新的值的时候,移动较短的索引值比移动较长数据行的排序次序更加容易。

      不同的MySQL存储引擎的索引实现的具体细节信息是不同的。例如,对于MyISAM数据表,该表的数据行保存在一个数据文件中,索引值保存在索引文件中。一个数据表上可能有多个索引,但是它们都被存储在同一个索引文件中。索引文件中的每个索引都包含一个排序的键记录(它用于快速地访问数据文件)数组。

      与此形成对照的是,BDBInnoDB存储引擎没有使用这种方法来分离数据行和索引值,尽管它们也把索引作为排序后的值集合进行操作。在默认情况下,BDB引擎使用单个文件存储数据和索引值。InnoDB使用单个数据表空间(tablespace),在表空间中管理所有InnoDB表的数据和索引存储。我们可以把InnoDB配置为每个表都在自己的表空间中创建,但是即使是这样,数据表的数据和索引也存储在同一个表空间文件中。
    前面的讨论描述了单个表查询环境下的索引的优点,在这种情况下,通过减少对整个表的扫描,使用索引明显地提高了搜索的速度。当你运行涉及多表联结(jion)查询的时候,索引的价值就更高了。在单表查询中,你需要在每个数据列上检查的值的数量是表中数据行的数量。在多表查询中,这个数量可能大幅度上升,因为这个数量是这些表中数据行的数量所产生的。

      假设你拥有三个未索引的表t1t2t3,每个表都分别包含数据列i1i2i3,并且每个表都包含了1000条数据行,其序号从11000。查找某些值匹配的数据行组合的查询可能如下所示:

    SELECTt1.i1, t2.i2, t3.i3
    FROM t1, t2, t3
    WHERE t1.i1 = t2.i2 ANDt2.i1 = t3.i3;


      这个查询的结果应该是1000行,每个数据行包含三个相等的值。如果在没有索引的情况下处理这个查询,那么如果我们不对这些表进行全部地扫描,我们是没有办法知道哪些数据行含有哪些值的。因此你必须尝试所有的组合来查找符合WHERE条件的记录。可能的组合的数量是1000x 1000 x100010亿!),它是匹配记录的数量的一百万倍。这就浪费了大量的工作。这个例子显示,如果没有使用索引,随着表的记录不断增长,处理这些表的联结所花费的时间增长得更快,导致性能很差。我们可以通过索引这些数据表来显著地提高速度,因为索引让查询采用如下所示的方式来处理:

      1.选择表t1中的第一行并查看该数据行的值。

      2.使用表t2上的索引,直接定位到与t1的值匹配的数据行。类似地,使用表t3上的索引,直接定位到与表t2的值匹配的数据行。

      3.处理表t1的下一行并重复前面的过程。执行这样的操作直到t1中的所有数据行都被检查过。

      在这种情况下,我们仍然对表t1执行了完整的扫描,但是我们可以在t2t3上执行索引查找,从这些表中直接地获取数据行。理论上采用这种方式运行上面的查询会快一百万倍。当然这个例子是为了得出结论来人为建立的。然而,它解决的问题却是现实的,给没有索引的表添加索引通常会获得惊人的性能提高。

      MySQL有几种使用索引的方式:

      ·如上所述,索引被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。

      ·对于使用了MIN()MAX()函数的查询,索引数据列中最小或最大值可以很快地找到,不用检查每个数据行。

      ·MySQL利用索引来快速地执行ORDERBYGROUPBY语句的排序和分组操作。

      ·有时候MySQL会利用索引来读取查询得到的所有信息。假设你选择了MyISAM表中的被索引的数值列,那么就不需要从该数据表中选择其它的数据列。在这种情况下,MySQL从索引文件中读取索引值,它所得到的值与读取数据文件得到的值是相同的。没有必要两次读取相同的值,因此没有必要考虑数据文件。


     索引的代价

      一般来说,如果MySQL能够找到方法,利用索引来更快地处理查询,它就会这样做。这意味着,对于大多数情况,如果你没有对表进行索引,就会使性能受到损害。这就是我所描绘的索引优点的美景。但是它有缺点吗?有的,它在时间和空间上都有开销。在实践中,索引的优点的价值一般会超过这些缺点,但是你也应该知道到底有一些什么缺点。

      首先,索引加快了检索的速度,但是减慢了插入和删除的速度,同时还减慢了更新被索引的数据列中的值的速度。也就是说,索引减慢了大多数涉及写操作的速度。发生这种现象的原因在于写入一条记录的时候不但需要写入数据行,还需要改变所有的索引。数据表带有的索引越多,需要做出的修改就越多,平均性能的降低程度也就越大。在本文的"高效率载入数据"部分中,我们将更细致地了解这些现象并找出处理方法。

      其次,索引会花费磁盘空间,多个索引相应地花费更多的磁盘空间。这可能导致更快地到达数据表的大小限制:

      ·对于MyISAM表,频繁地索引可能引起索引文件比数据文件更快地达到最大限制。

      ·对于BDB表,它把数据和索引值一起存储在同一个文件中,添加索引引起这种表更快地达到最大文件限制。

      ·InnoDB的共享表空间中分配的所有表都竞争使用相同的公共空间池,因此添加索引会更快地耗尽表空间中的存储。但是,与MyISAMBDB表使用的文件不同,InnoDB共享表空间并不受操作系统的文件大小限制,因为我们可以把它配置成使用多个文件。只要有额外的磁盘空间,你就可以通过添加新组件来扩展表空间。

      使用单独表空间的InnoDB表与BDB表受到的约束是一样的,因为它的数据和索引值都存储在单个文件中。

      这些要素的实际含义是:如果你不需要使用特殊的索引帮助查询执行得更快,就不要建立索引。

      选择索引

      假设你已经知道了建立索引的语法,但是语法不会告诉你数据表应该如何索引。这要求我们考虑数据表的使用方式。这一部分指导你如何识别出用于索引的备选数据列,以及如何最好地建立索引:

      用于搜索、排序和分组的索引数据列并不仅仅是用于输出显示的。换句话说,用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDERBYGROUPBY子句中的列。仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是很好的备选列:

    SELECT
    col_a<-
    不是备选列
    FROM
    tbl1LEFT JOIN tbl2
    ON tbl1.col_b = tbl2.col_c <-
    备选列
    WHERE
    col_d= expr; <-
    备选列


      当然,显示的数据列与WHERE子句中使用的数据列也可能相同。我们的观点是输出列表中的数据列本质上不是用于索引的很好的备选列。

      Join子句或WHERE子句中类似col1=col2形式的表达式中的数据列都是特别好的索引备选列。前面显示的查询中的col_bcol_c就是这样的例子。如果MySQL能够利用联结列来优化查询,它一定会通过减少整表扫描来大幅度减少潜在的表-行组合。

      考虑数据列的基数(cardinality)。基数是数据列所包含的不同值的数量。例如,某个数据列包含值137473,那么它的基数就是4。索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别(只有"M""F"两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是"30%"。现在查询优化器更加复杂,把其它一些因素也考虑进去了,因此这个百分比并不是MySQL决定选择使用扫描还是索引的唯一因素。

      索引较短的值。尽可能地使用较小的数据类型。例如,如果MEDIUMINT足够保存你需要存储的值,就不要使用BIGINT数据列。如果你的值不会长于25个字符,就不要使用CHAR(100)。较小的值通过几个方面改善了索引的处理速度:

      ·较短的值可以更快地进行比较,因此索引的查找速度更快了。

      ·较小的值导致较小的索引,需要更少的磁盘I/O

      ·使用较短的键值的时候,键缓存中的索引块(block)可以保存更多的键值。MySQL可以在内存中一次保持更多的键,在不需要从磁盘读取额外的索引块的情况下,提高键值定位的可能性。

      对于InnoDBBDB等使用聚簇索引(clusteredindex)的存储引擎来说,保持主键(primarykey)短小的优势更突出。聚簇索引中数据行和主键值存储在一起(聚簇在一起)。其它的索引都是次级索引;它们存储主键值和次级索引值。次级索引屈从主键值,它们被用于定位数据行。这暗示主键值都被复制到每个次级索引中,因此如果主键值很长,每个次级索引就需要更多的额外空间。

      索引字符串值的前缀(prefixe)。如果你需要索引一个字符串数据列,那么最好在任何适当的情况下都应该指定前缀长度。例如,如果有CHAR(200)数据列,如果前面10个或20个字符都不同,就不要索引整个数据列。索引前面10个或20个字符会节省大量的空间,并且可能使你的查询速度更快。通过索引较短的值,你可以获得那些与比较速度和磁盘I/O节省相关的好处。当然你也需要利用常识。仅仅索引某个数据列的第一个字符串可能用处不大,因为如果这样操作,那么在索引中不会有太多的唯一值。

      你可以索引CHARVARCHARBINARYVARBINARYBLOBTEXT数据列的前缀。

      使用最左(leftmost)前缀。建立多列复合索引的时候,你实际上建立了MySQL可以使用的多个索引。复合索引可以作为多个索引使用,因为索引中最左边的列集合都可以用于匹配数据行。这种列集合被称为"最左前缀"(它与索引某个列的前缀不同,那种索引把某个列的前面几个字符作为索引值)。

      假设你在表的statecityzip数据列上建立了复合索引。索引中的数据行按照state/city/zip次序排列,因此它们也会自动地按照state/citystate次序排列。这意味着,即使你在查询中只指定了state值,或者指定statecity值,MySQL也可以使用这个索引。因此,这个索引可以被用于搜索如下所示的数据列组合:

    state,city, zip
    state, city
    state


      MySQL不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果你按照cityzip来搜索,就不会使用到这个索引。如果你搜索给定的state和具体的ZIP代码(索引的13列),该索引也是不能用于这种组合值的,尽管MySQL可以利用索引来查找匹配的state从而缩小搜索的范围。

      不要过多地索引。不要认为"索引越多,性能越高",不要对每个数据列都进行索引。我们在前面提到过,每个额外的索引都会花费更多的磁盘空间,并降低写操作的性能。当你修改表的内容的时候,索引就必须被更新,甚至可能重新整理。如果你的索引很少使用或永不使用,你就没有必要减小表的修改操作的速度。此外,为检索操作生成执行计划的时候,MySQL会考虑索引。建立额外的索引会给查询优化器增加更多的工作量。如果索引太多,有可能(未必)出现MySQL选择最优索引失败的情况。维护自己必须的索引可以帮助查询优化器来避免这类错误。

      如果你考虑给已经索引过的表添加索引,那么就要考虑你将增加的索引是否是已有的多列索引的最左前缀。如果是这样的,不用增加索引,因为已经有了(例如,如果你在statecityzip上建立了索引,那么没有必要再增加state的索引)。

      让索引类型与你所执行的比较的类型相匹配。在你建立索引的时候,大多数存储引擎会选择它们将使用的索引实现。例如,InnoDB通常使用B树索引。MySQL也使用B树索引,它只在三维数据类型上使用R树索引。但是,MEMORY存储引擎支持散列索引和B树索引,并允许你选择使用哪种索引。为了选择索引类型,需要考虑在索引数据列上将执行的比较操作类型:

      ·对于散列(hash)索引,会在每个数据列值上应用散列函数。生成的结果散列值存储在索引中,并用于执行查询。散列函数实现的算法类似于为不同的输入值生成不同的散列值。使用散列值的好处是散列值比原始值的比较效率更高。散列索引用于执行=<=>操作等精确匹配的时候速度非常快。但是对于查询一个值的范围效果就非常差了:

    id< 30
    weight BETWEEN 100 AND 150


      ·B树索引可以用于高效率地执行精确的或者基于范围(使用操作<<==>=><>!=BETWEEN)的比较。B树索引也可以用于LIKE模式匹配,前提是该模式以文字串而不是通配符开头。

      如果你使用的MEMORY数据表只进行精确值查询,散列索引是很好的选择。这是MEMORY表使用的默认的索引类型,因此你不需要特意指定。如果你希望在MEMORY表上执行基于范围的比较,应该使用B树索引。为了指定这种索引类型,需要给索引定义添加USINGBTREE。例如:

    CREATETABLE lookup
    (
    id INT NOT NULL,
    name CHAR(20),
    PRIMARYKEY USING BTREE (id)
    ) ENGINE = MEMORY;


      如果你希望执行的语句的类型允许,单个MEMORY表可以同时拥有散列索引和B树索引,即使在同一个数据列上。

      有些类型的比较不能使用索引。如果你只是通过把值传递到函数(例如STRCMP())中来执行比较操作,那么对它进行索引就没有价值。服务器必须计算出每个数据行的函数值,它会排除数据列上索引的使用。

      使用慢查询(slow-query)日志来识别执行情况较差的查询。这个日志可以帮助你找出从索引中受益的查询。你可以直接查看日志(它是文本文件),或者使用mysqldumpslow工具来统计它的内容。如果某个给定的查询多次出现在"慢查询"日志中,这就是一个线索,某个查询可能没有优化编写。你可以重新编写它,使它运行得更快。你要记住,在评估"慢查询"日志的时候,""是根据实际时间测定的,在负载较大的服务器上"慢查询"日志中出现的查询会多一些。

    展开全文
  • 多选 对于索引(a,b,c),下列哪些说法是正确的:答案在文末 A. 查询语句 where a between 5 and 10 可以使用该索引。 B. 查询语句 where a = 5 and b between 5 and 10 可以使用该索引。 C. 查询语句 where a in ...

    多选 对于索引(a,b,c),下列哪些说法是正确的:答案在文末

    • A. 查询语句 where a between 5 and 10 可以使用该索引。
    • B. 查询语句 where a = 5 and b between 5 and 10 可以使用该索引。
    • C. 查询语句 where a in (5,6,7,8,9) and b = 5 可以使用该索引。
    • D. 查询语句 where b = 5 and c = 10 可以使用该索引。

    多选 关于组合索引,下他哪些说法符合《阿里巴巴Java开发手册》:答案在文末

    • A. 查询条件 where a=0’ and b=‘1’,当组合索引为(b a)的时候能进行索引扫描。
    • B. 查询条件where a=‘0’ and b=‘1’,当组台素引为(C,a,b)的时候能进行素引扫描。
    • C. 查询select b from table where a=‘0’,当电台素引为(a b)的时候会进行素引扫描。
    • D. 查询条件where a> ‘O’ order by b,当组合素引为(a. b)时会利用素引进行排序。

    多选 关于系统安全,下列哪些说法符合《阿里巴巴Java开发手册》:答案在文末

    • A. 表单、AJAX提交不需要进行CSRF安全过滤。
    • B. 表单、AJAX提交必须执行CSRF安全过滤。
    • C. URL外部重定向传入的目标地址必须执行白名单过滤。
    • D. 用户输入的SQL参数严格使用参数绑定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接SQL访问数据库。

    多选 关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:答案在文末

    • A. 在接口类中的方法和属性使用public修饰符。
    • B. 对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。
    • C. 对于Service类,基于SOA的理念,是以接口方式暴露服务。
    • D. 尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。

    多选 如何处理单元测试产生的数据,下列哪些说法是正确的?:答案在文末

    • A. 测试数据入库时加特殊前缀标识。
    • B. 测试数据使用独立的测试库。
    • C. 自动回滚单元测试产生的脏数据。
    • D. 无须区别,统一在业务代码中进行判断和识别。

    公号有 600 道题库,答案,持续更新中

    关注:回复关键词:“考试题” 获取全部答案

    展开全文
  • 【多选题】下列运算符的使用正确的有哪些( )【多选题】以下选项中,... print(len(s))【多选题】以下的布尔代数运算正确的是( )【单选题】关于 Python 语句 P = –P,以下选项中描述正确的是________【单选题】下列不...
  • 数据库中如何正确使用索引

    千次阅读 2019-07-08 14:16:44
    SQL索引有两种,聚集索引和非聚集索引。 例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法...
  • 索引是由Oracle维护的可选结构,为数据提供快速的访问。准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度。 当建立一个索引时,必须指定用于跟踪的表名以及一个或多个表列。一旦建立了索引,...
  • 数据库索引是什么

    2019-08-12 17:48:05
    今天学习了一些数据库索引的知识简单整理一下,做个记录: 一、什么是索引? 1.一句话总结:索引是用来存储数据表中指定列值的一种数据结构,可以有效提高检索速度。 2.既然索引是一种数据结构,哪些数据结构用于...
  • 让我们一起学习大而复杂的数据库索引机制!尽量的做到全面且正确
  • 正确的理解MySQL的索引机制以及内部实现, 第二部分更倾向于讲解MySQL B+树索引的实现原理
  • 聚集索引    在创建聚集索引时,将会对表进行复制,对表中的数据进行排序,然后删除原始的表。因此,数据库上必须有足够的空闲空间,以容纳数据复本。默认情况下,表中的数据在创建...如果有任何行排序不正确,即
  • 聚集索引,非聚集索引,覆盖索引 原理

    万次阅读 多人点赞 2018-08-28 11:37:34
    「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能 使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的...
  • 关于倒排索引简单明了的总结

    千次阅读 2019-04-24 16:43:06
    关于像ElasticSearch什么的实时搜索引擎都是应用的倒排索引关于倒排索引解释有的人啰里啰嗦说一堆看完整的云里雾里的;所以自己进行了简单的总结: 倒排索引是目前搜索引擎公司对搜索引擎最常用的存储方式,也是...
  • Eclipse ndk插件正确索引纯C文件

    千次阅读 2014-11-24 11:45:48
    通过 add native support 以后是可以正确索引c++代码, 包括NDK提供的头文件都可以使用CDT工程一样。但是,当把cpp文件改成c文件以后,会发现所有的头文件index全部不正确了,导致cdt各种检索不到头文件的错误。但是...
  • 索引: 语法: CREATE INDEX test1_id_index ON test1 (id); 索引的名字test1_id_index可以自由选择,但我们最好选择一个能让我们想起该索引用途的名字。 为了移除一个索引,可以使用DROP INDEX命令。索引可以随时...
  • 场景描述: 在创建SolrCloud的索引时,发现数据量变少了。多次测试发现,每次创建索引都会少一部分,在运行其他创建索引程序时,之前的索引量会达到正确索引量,但是后面的又会少一部分。问题出在MapReduce程序中,...
  • 文章目录名词定义谓词索引片及匹配列索引过滤及过滤列三星索引星级评定设计最佳索引 名词定义 谓词 简单谓词和复杂谓词 WHERE字句中的每个条件称为一个谓词。 过滤因子 描述了谓词的选择性,即表中满足谓词条件的...
  • 我们来看看比较大众的定义,OK,那就直接百度百科吧:"索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。" 看中心语-关键词[一种结构],说到底索引就是对数据列的值进行...
  • 索引

    2013-03-15 10:16:20
    索引介绍  1.1 索引的创建语法:  CREATE UNIUQE | BITMAP INDEX .  ON .  ( | ASC | DESC,  | ASC | DESC,...)  TABLESPACE   STORAGE   LOGGING | NOLOGGING
  • 今天看SQL方面的书,看到关于索引方面的讲解不太详细,弄的一头雾水,似懂非懂,特别是聚集索引和非聚集索引。深知索引对提高数据库查询速度的重要性,所以就花了半个下午的时间在网上Google了一些这方面的文章看...
  • 「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能 使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的...
  • SQL Server索引优化——重复索引

    千次阅读 2019-02-20 18:06:00
    在写完《SQLServer索引优化——无用索引索引缺失》系列后,就想着写点关于发现重复索引的内容,刚好在Kimberly的博文中发现了这篇,就偷懒了,直接将其翻译过来。 一直以来,对重复索引都有许多困惑,我想的最多...
  • 索引是为了加速对表中数据行的检索而创建的一种分散的存储结构实现原理(B+树) 通俗点说类似于一本书的目录,通过目录可以快速查到你想要的数据。   索引的优缺点 优点: 大大缩短查询时间,加索引至少比普通...
  • Mysql索引:图文并茂,深入探究索引的原理和使用

    千次阅读 多人点赞 2020-11-25 16:43:44
    关于Mysql索引的走心总结,建议收藏,反复阅读。
  • 以下的文章主要是对Oracle索引整理的描述,其中包含了Oracle的索引陷阱,以及各种索引使用场合以及建议,还有能用唯一索引,一定用唯一索引有哪些的详细内容的介绍,以下就好似相关内容的介绍。 一、Oracle的索引...
  • SQL索引

    千次阅读 2016-04-06 11:47:53
    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。  1.1 什么是索引?  SQL索引有两种,聚集索引和非聚集索引索引...
  • 【多选题】以下选项属于 Python 整数类型的是( )【其它】根据CAD原文件绘制别墅立面图:如图 别墅立面图002.dwg【单选题】字符串是...【多选题】关于赋值语句的作用,错误的描述是( )【单选题】下面代码的执行结果是__...
  • MySQL 索引

    千次阅读 2020-07-06 09:17:38
    花了好久整理的 MySQL 索引笔记,赶紧收藏
  • 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引的遵循原则:1、最左侧原则,表的最左侧的一列,往往数据不会发生改变,不影响其他列的数据;2、...
  • 今天我们来聊一聊关于 聚簇索引和非聚簇索引的问题;  刚开始学数据库SQL的时候,就知道有主键啊(Primary-key),外键啊(Foreign-key)啥的,连个表查询就已经不清楚是要on 那几个字段了,在数据量不太大的情况下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,118
精华内容 67,647
关键字:

关于索引的描述正确的是