• 聊聊Hash索引


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

    在MySQL中,只有Memory引擎显示支持哈希索引,也是默认索引类型。

    如:

    create table test_hash(

    fname varchar(50) not null,

    lname varchar(50) not null,

    key using hash(fname)

    )engine=memory;

    mysql>select * from test_hash;

    fname  |  lname

    Peter   |  Andyxi

    mysql>select lname from test_hash where fname='Peter';

    过程:

    1.MySQL先计算‘Peter’的哈希值,并使用该值寻找对应的记录指针

    2.通过指针找到对应的行的值

    Hash Index注意点:

    1.只包含哈希值和指针,而不存储字段值。

    2.存储不是执照索引值顺序的,无法用于排序。

    3.不支持部分索引列匹配,因为始终是使用索引列的全部内容来计算哈希值的。

    4.只支持等值比较查询。

    案例:存储大量的URL,并需要根据URL进行搜索查找。

    mysql>select id from url where url="http://www.mysql.com";

    mysql> create table pseudohash(
    -> id int unsigned not null auto_increment,
    -> url varchar(255) not null,
    -> url_crc int unsigned not null default 0,
    -> primary key(id));
    Query OK, 0 rows affected (0.72 sec)

    可以通过触发器在插入和更新时维护url_cc列。

    mysql> delimiter //
    mysql> create trigger pseudohash_crc_ins before insert on pseudohash for each row begin set new.url_crc=crc32(new.url);
    -> end;
    -> //
    Query OK, 0 rows affected (0.02 sec)

    mysql> create trigger pseudohash_crc_upd before update on pseudohash for each row begin set new.url_crc=crc32(new.url);
    -> end;
    -> //
    Query OK, 0 rows affected (0.01 sec)

    mysql> delimiter;

    mysql> select * from pseudohash;
    Empty set (0.00 sec)

    mysql> insert into pseudohash(url) values('http://www.mysql.com');
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from pseudohash;
    +----+----------------------+------------+
    | id | url | url_crc |
    +----+----------------------+------------+
    | 1 | http://www.mysql.com | 1560514994 |
    +----+----------------------+------------+

    mysql> update pseudohash set url="http://www.mysql.com/" where id=1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from pseudohash;
    +----+-----------------------+------------+
    | id | url | url_crc |
    +----+-----------------------+------------+
    | 1 | http://www.mysql.com/ | 1558250469 |
    +----+-----------------------+------------+
    1 row in set (0.00 sec)

  • 相关阅读:
    POJ 2689
    NEFU 109
    HDU 2098
    NEFU 2
    NEFU 117
    NEFU 84
    POJ 1061
    NEFU116 GCD
    NEFU 115
    HDU 2099
  • 原文地址:https://www.cnblogs.com/chinaops/p/10619147.html
Copyright © 2020-2023  润新知