聊聊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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示