В базе данных MySQL у меня есть таблица, которая имеет только 2 столбца для всех намерений и целей: ключевой хэш и значение. Оба типа INTEGER
. Столбец хеша будет иметь большое количество дубликатов (в худшем случае ожидается ~ 80 тыс. Дубликатов для каждого хеша, из-за небольшого прообраза хеша сделать уникальным невозможно), и таблица содержит порядка 100 миллиардов строк.
Сейчас у меня есть индексированный хеш-столбец (CREATE INDEX idx_hash ON table(hash)
); Однако поиск очень медленный. Что-то вроде SELECT value FROM table WHERE hash=123 LIMIT 50
займет минуты, если не часы, в то время как аналогичный выбор в таблице аналогичного размера в столбце первичного ключа завершится очень быстро на той же машине.
Итак, мой вопрос: как мне оптимизировать поиск в этом случае? Возможно ли сублинейное ВЫБОР времени в столбцах индекса? Эта таблица будет в основном только для чтения, ее восстановление возможно, но займет много времени, поэтому я хотел бы собрать некоторую информацию и сделать это правильно.
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)