memory型表支持Hash索引

 

mysql> create table test_memory  
    -> (i smallint not null auto_increment,  
    -> name varchar(10),primary key(i))  
    -> engine=memory charset=gbk;  
Query OK, 0 rows affected (0.01 sec)  
 
mysql> SHOW INDEX FROM test_memory;  
+————-+————+———-+————–+————–+——–+——+  
| Table       | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |  
+————-+————+———-+——————+———-+——–+——+  
| test_memory |          0 | PRIMARY  |            1 | i           | NULL      |           0 |     NULL | NULL   |      | HASH       |         |  
+————-+————+———-+——————+———-+——–+——+-  
1 row in set (0.02 sec)  
 
memory型表创建的PK,默认的就是hash索引  
 
mysql> explain select * from test_memory where i>1 /G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: test_memory  
         type: ALL 
possible_keys: PRIMARY 
          key: NULL 
      key_len: NULL 
          ref: NULL 
         rows: 2  
        Extra: Using where 
1 row in set (0.04 sec)  
 
mysql> explain select * from test_memory where i=1 /G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: test_memory  
         type: const  
possible_keys: PRIMARY 
          key: PRIMARY 
      key_len: 2  
          ref: const  
         rows: 1  
        Extra:  
1 row in set (0.01 sec) 

从这里两个对比中发现,hash index支持”=”等式查询,不支持”>=”,”<=”,”<”,”>”,”<>”,”between”,”!=”,”like”

hash索引的创建:

mysql> create table test_memory_sp  
    -> (i smallint not null,  
    -> name varchar(10))  
    -> engine=memory charset=gbk;  
Query OK, 0 rows affected (0.10 sec)  
 
mysql> create index ind_hash using hash on test_memory_sp(i);  
Query OK, 0 rows affected (0.02 sec)  
Records: 0  Duplicates: 0  Warnings: 0  
 
mysql> insert into test_memory_sp  values(1,’A');  
Query OK, 1 row affected (0.00 sec)  
 
mysql> insert into test_memory_sp  values(1,’B');  
Query OK, 1 row affected (0.00 sec)  
 
mysql> insert into test_memory_sp  values(2,’C');  
Query OK, 1 row affected (0.00 sec)  
 
mysql> explain select * from test_memory_sp where i=1 /G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: test_memory_sp  
         type: ref  
possible_keys: ind_hash  
          key: ind_hash  
      key_len: 2  
          ref: const  
         rows: 2  
        Extra:  
1 row in set (0.00 sec) 

### Hash索引的数据结构与实现原理 Hash索引是一种基于哈希Hash Table)的索引结构,其核心思想是对索引键值执行哈希函数计算,从而快速定位数据存储位置。以下是关于Hash索引的具体工作原理和实现细节: #### 1. **Hash索引的核心概念** Hash索引通过哈希函数将索引键映射到固定的地址空间中[^3]。具体来说,当插入一条记录时,会先对该记录的关键字应用哈希函数得到一个哈希值,再利用该哈希值找到对应的存储桶(Bucket)。如果多个关键字经过哈希运算后产生了相同的哈希值,则会发生哈希冲突。 #### 2. **Hash索引的优点** - 查询速度极快:对于等值查询(`=` 或 `IN`),由于只需一次哈希计算即可定位目标数据,因此性能优于B+Tree索引。 - 存储紧凑:相比B+Tree索引Hash索引通常占用较少的空间,因为不需要维护复杂的树形结构[^5]。 #### 3. **Hash索引的局限性** - 不支持范围查询:由于Hash索引无法保持数据的逻辑顺序,因此不适合用于范围条件(如 `<`, `>`, `<=`, `>=` 等)的查询。 - 哈希冲突问题:当不同关键字产生相同哈希值时,需要额外机制解决冲突,这可能降低性能。 #### 4. **Hash索引的实现方式** Hash索引的实现依赖于哈希这一基础数据结构。以下是其实现过程中的几个关键点: - **哈希函数设计**:一个好的哈希函数应尽可能减少碰撞概率并均匀分布数据。常用的哈希算法有MD5、SHA系列以及专门针对整数或字符串优化的简单哈希函数。 - **冲突解决方案**: - 开链法(Separate Chaining):为每个桶创建一个链来保存所有发生冲突的元素。 - 开放寻址法(Open Addressing):在遇到冲突时寻找下一个可用槽位存放新元素,常用的方法包括线性探测、二次探测和双重散列。 #### 5. **实际应用场景** 在MySQL中,Memory存储引擎广泛使用了Hash索引。这是因为Memory主要用于临时高速缓存场景,而Hash索引正好能够提供高效的随机读取能力。 ```sql CREATE TABLE example ( id INT NOT NULL, name VARCHAR(50), PRIMARY KEY (id) USING HASH -- 使用Hash索引作为主键 ) ENGINE=MEMORY; ``` 上述SQL语句展示了如何显式指定Hash索引作为主键。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值