mysql索引类型(按存储结构划分)

关于mysql索引类型,网上有很多相关的介绍,给人的感觉很乱。鄙人在翻阅相关书籍后,特意梳理了一下。哪里有不对的地方,欢迎指正!

1. B-Tree索引

    它使用B-Tree数据结构来存储数据,实际上很多存储引擎使用的是B+Tree。B+Tree和B-Tree的不同点在于:

    (1) 非叶子节点只存储键值信息

    (2) 所有叶子节点之间都有链指针

    (3) 数据记录都存放在叶子节点中

    B-Tree模型:

   

    B+Tree模型:

     

    B-Tree对索引列是顺序组织存储的,很适合查找范围数据。看下B-Tree索引适用哪些查询:

    (1) 全值匹配 

        全值匹配是指查询中使用的条件和索引中的所有列进行匹配。比如有索引 index(last_name, first_name, date) ,查询的条件为:where last_name=? and first_name=? and date=? 。

    (2) 匹配最左前缀

        只使用索引的第一列。比如查询条件为:where last_name = ?

 (3) 匹配列前缀

        只匹配某一列值得开头部分。

    (4) 匹配范围值

    (5) 精确匹配某一列并范围匹配另一列

         比如:where last_name = ? and first_name like kim%

    (6) 只访问索引的查询 

2. 哈希索引

    哈希索引基于哈希表实现。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在mysql中,Memory引擎显式支持哈希索引。

    举例说明,有张表:

    CREATE TABLE testhash (

        fname VARCHAR(50) NOT NULL,

   lname VARCHAR(50) NOT NULL,

         KEY USING HASH(fname)

    ) ENGINE=MEMORY; 

    表中有如下数据:

fname lname
Arjen Lentz
Baron Schwartz
Peter Zaitsev
Vadim Tkachenko

假设索引使用假想的哈希函数f(), 如下:

 f('Arjen') = 2323

 f('Baron') = 7437

 f('Peter') = 8784

 f('Vadim') = 2458

那么哈希索引的数据结构:

槽(Slot)           值(Value)

2323                     指向第1行的指针

2458                     指向第4行的指针

7437                     指向第2行的指针

8784                     指向第3行的指针

如果使用一条sql语句进行查询:select lname from testhash where fname = 'Peter'; 过程为:

计算‘Peter’的哈希值(f('Peter')=8784)----->查找哈希值对应的指针----->根据指针或得相应的数据。

哈希索引的特点:索引的结构十分紧凑,因此查找速度非常快;哈希索引数据不是按照索引顺序存储的,无法用于排序;哈希索引不支持部分索引列匹配查找;哈希索引只支持等值比较查询(=,IN(),<=>),不支持范围查询,如where price>100;

3. 全文索引

    全文索引查找的是文本中的关键词,不是直接比较索引中的值。

- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

    

 

posted @ 2019-04-11 17:49  水滴月  阅读(9297)  评论(0编辑  收藏  举报