在MySQL数据库中,我有一个只有2列的表,用于所有意图和目的:密钥哈希值和值。两者都是INTEGER
类型。哈希列将有大量的重复(最坏的情况是每个哈希需要大约80k重复,由于小的哈希原像不可能使其唯一),并且该表包含大约1000亿行。
现在我将哈希列编入索引(CREATE INDEX idx_hash ON table(hash)
);但查找速度很慢。像SELECT value FROM table WHERE hash=123 LIMIT 50
这样的东西,如果不是几小时,则需要几分钟,而主键列上类似大小的表上的类似选择将在同一台机器上快速完成。
所以我的问题是在这种情况下如何优化查找?索引列上是否可以使用子线性时间SELECT?这个表大部分是只读的,重建它是可能的,但需要很长时间,所以我想收集一些信息并正确地完成。
EXPLAIN
说:
+----+-------------+----------------+------------+------+---------------+------+---------+------+-----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+------+---------+------+-----------+----------+-------------+
| 1 | SIMPLE | partial_lookup | NULL | ALL | NULL | NULL | NULL | NULL | 100401571 | 10.00 | Using where |
+----+-------------+----------------+------------+------+---------------+------+---------+------+-----------+----------+-------------+
ANALYZE
:
+--------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------+---------+----------+----------+
| partial_lookup | analyze | status | OK |
+--------------------+---------+----------+----------+
1 row in set (1.47 sec)