zoukankan      html  css  js  c++  java
  • 索引与算法

    innodb存储引擎支持以下几种常见的索引:

    B+树索引

    全文索引

    哈希索引

      其中,innodb支持的索引是只适应的,不能人为的干预是否在一张表中生成哈希索引。

      数据库的B+树索引可以分为聚集索引和辅助索引,但是不管是聚集还是辅助的索引,其内部都是B+树的,即高度平衡的,叶子节点存放着所有的数据。聚集索引与辅助索引不同的是,叶子节点存放的是否是一整行的信息。

    聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+数据结构一样,每个数据页都通过一个双向链表来进行链接。

      由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引。在大多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外,由于定义了数据的逻辑顺序,聚集索引能特别快的访问针对范围值的查询。

    查询优化器能够快速发现某一段范围的数据页需要扫描。

      对于辅助索引(secondary index,也称非聚集索引),叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签(bookmark)。该书签用来告诉innodb存储引擎哪里可以找到与索引相对应的行数据。

    由于innodb存储引擎表是索引组织表,因此innodb存储引擎的辅助索引的书签就是相应行数据的聚集索引键。

      辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。当通过辅助索引来寻找数据时,innodb存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。

      OLTP的索引效果高于OLAP,OLAP上的索引更复杂,需要分析研究复杂语句。

    联合索引

       比如有列a,b,c。构建索引 key idx_ab(a,b)。这个时候使用where查询条件的时候where a=1 and b=2,可以会用到索引,where a=2,也可以使用索引。但where b=3就不会使用到索引了,因为在构建B+数的时候,a列是按顺序构建的,b列是散列无序的。

      联合索引的支持的顺序的,假如索引是(a,b,c)则查询条件中用到a;a,b;a,b,c 都会用到索引,但出现跳跃式的a,c则不会用到索引,或索引的效果不大。因为索引的构造是先按a排序,再按b排序,最后按c排序。

    覆盖索引

      innodb存储引擎支持覆盖索引,即从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。

    全文检索

      mysql数据库支持全文检索(full-text  search)的查询,其语法为:

      MATCH (col1,col2,...) AGAINST (expr [search_modifier])

    search_modifier:
      {
           IN NATURAL LANGUAGE MODE
         | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
         | IN BOOLEAN MODE
         | WITH QUERY EXPANSION
      }

      match 指定了需要被查询的列,AGAINST指定了使用何种方法去进行查询。下面将对各种查询模式进行详细的介绍。

      1、Natural Language

      全文检索通过MATCH函数进行查询,默认查用Natural Language模式,其表示查询带有指定word的文档。

        select * from fts_a where body like '%pease%';

      显然上述sql语句不能使用B+树索引。若采用全文索引技术,可以用下面的sql语句进行查询:

      select * from fts_a  where  MATCH(body) AGAINST ('porridge'  IN NATURAL LANGUAGE MODE);

      一般使用默认。省略后面的修饰符

      2、boolean

      使用该修饰符的时候查询的字符串有特殊的含义。

      3、query expansion

      mysql 数据库还支持全文检索的扩展查询。这种查询通常在查询的关键词太短,用户需要implied knowledge(隐含知识)时进行。

      

  • 相关阅读:
    Crystal Reports基础知识
    Dashboard与中国式报表的区别以及常见的Dashboard控件
    函数总结
    SQL Server 索引使用入门
    Linux+C 开发基础
    vi 开发环境~~转载
    linux mysql 基础操作使用
    sourceinsight 快捷键 转帖
    vi 利器
    fedora 7 英文环境 的汉字显示
  • 原文地址:https://www.cnblogs.com/wonchaofan/p/13550068.html
Copyright © 2011-2022 走看看