zoukankan      html  css  js  c++  java
  • MySQL索引(一)----数据结构类型

    1、B-Tree索引

    在人们谈论索引的时候,如果没有特别指明类型,多半说的就是B树索引,它是使用 B-Tree 数据结构来存储数据。

    也有很多存储引擎使用的是B+Tree,例如 InnoDB

    例如:

    CREATE TABLE People (
        last_name 	varchar(50) 	not null,
        first_name 	varchar(50) 	not null,
        dob		date		not null,
        gander	enum('m','f')	not null,
        key(last_name, first_name, dob)
    )
    

    对于表中的每一行数据,索引中包含了 last_name、first_name, 和 dob 列的值。

    索引对多个值进行排序的一局是 CREATE TABLE 语句中定义索引时列的顺序。

    B-Tree 索引的查询类型:B-Tree 索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于很久最左键前缀的查找。

    • 全值匹配:和索引中的所有列进行匹配。
    • 匹配最左前缀:只使用索引的第一列,例如可查找所有姓为 Allen 的人。
    • 匹配列前缀:可以只匹配某一列的值的开头部分。这里只使用了索引的第一列。
    • 匹配范围值:可用于查找姓在 Allen 和 Barrymore 之间的人。这里只使用了索引的第一列。

    B-Tree 索引的限制:

    • 如果不是按照索引的最左列开始查找,则无法使用索引。例如上例中的索引无法用于查找名字为 Bill 的人,也无法只查找某个特定生日的人,因为这两个都不是最左数据列。
    • 不能跳过索引中的列。也就是无法用于查找第一列和第三列的结果,因为跳过了第二列。但如果只查找第一列是可以的。
    • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。例如 WHERE last_name = 'zhangsan' AND first_name LIKE 'J%' AND dob = '2000-12-1',这个查询只能使用索引的前两列。

    2、哈希索引

    哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。 对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据化的指针。

    在 MySQL 中,只有 Memory 引擎支持哈希索引。这也是 Memory 引擎的默认索引类型,Memory 引擎同时也支持 B-Tree 索引。

    因为哈希索引的限制较多,所以只适用于某些特定的场合。而一旦适合哈希索引,则它带来的性能提升将非常显著。

    另外,InnoDB 引擎有一个特殊的功能叫做”自适应哈希索引“。可以适当去了解。

    3、空间数据索引

    MyISAM 表支持空间索引(R-Tree),可以用作地理数据存储。和 B-Tree 索引不同,这类索引无需前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。

    4、全文索引

    全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文索引和其他几类索引的匹配方式完全不一样。它有许多需要注意的细节,如停用词、词干和复数、布尔搜索等。全文索引更类似于搜索引擎做的事情,而不是简单的 WHERE 条件匹配。

    在相同的列上同时创建全文索引和基于值的 B-Tree 索引不会有冲突。

  • 相关阅读:
    iOS技术框架构和更新版本的技术特性
    iOS第三方常用类库
    查看MySQL系统变量的命令
    解决WIN7下VMWARE虚拟机无法上网问题
    MySQL性能优化的最佳20+条经验
    PHP高效率写法(详解原因)
    google官方建议使用的网站性能测试工具
    ETL工具-KETTLE教程 实例实战4----转换(值映射、列转行,增加常量、增加序列等)
    ETL工具-KETTLE教程实例实战2----环境介绍
    ETL工具-KETTLE教程实例实战1----术语和定义
  • 原文地址:https://www.cnblogs.com/luler/p/14955387.html
Copyright © 2011-2022 走看看