Just like the hash function in java
Dispatch field’s row pointer to a slot by field’s hash code.
If some rows have same hash code, then storage pointer to a list.
Prepare
Create a table like this:1
2
3
4
5CREATE TABLE animal (
name VARCHAR(50) NOT NULL,
weight DOUBLE(11, 3) NOT NULL,
KEY `name` (`name`) USING HASH
) ENGINE=MEMORY;
mysql> select * from animal;
+————+————-+
| name | weight |
+————+————-+
| python | 20.500 |
| bear | 321.720 |
| lion | 221.980 |
| rabbit | 7.123 |
+————+————-+
Try
f represent the hash function:1
2
3
4f('python') = 2123
f('bear') = 6417
f('lion') = 8771
f('rabbit') = 2359
then:
| Slot | Hash value |
|---|---|
| 2123 | point to row 1 |
| 2359 | point to row 4 |
| 6417 | point to row 2 |
| 8771 | point to row 3 |
- Mysql calculate query’s hash value to decide
which pointer or a pointer list, sql want. - Because index it’s self only store a
shortvalue,
so hash code’s length is not determined by data type.
Some limit
- Index only have hash code, so can’t avoid table space i/o.
But if table engine is memory, that’s not affected much. - Hash index can’t be used to sort query collection.
- Not support part match, it only rely on hash code.
- Only support
equaloperation like:=<>in()not in()