Ограничение длины ключа MyISAM, пытаясь ускорить работу с полями md5 - PullRequest
0 голосов
/ 16 декабря 2010

Я работаю над небольшой таблицей MyISAM - около 30 тыс. Записей, размер - 10 Мб. Одним из полей является varchar (500+), потому что я использую utf8_unicode_ci, я не могу проиндексировать это поле (я достиг предела в 1000 байт), и в то же время мне нужно выполнить множество запросов "get_or_create" на основе этого поля. Я пытаюсь оптимизировать базу данных, но все еще медленно.

Это хорошее решение для создания дополнительного поля, которое будет содержать md5 значения varchar и индексировать его / использовать для поиска? Кто-нибудь пробовал этот подход?

1 Ответ

1 голос
/ 17 декабря 2010

Мне кажется плохой идеей использовать такой широкий столбец в качестве ключа, но, кроме этого, вы определенно можете сделать что-то вроде того, что вы предлагаете.Вам даже не нужно использовать MD5, все, что вам нужно, это хеш-функция, которая производит несколько коллизий, но уникальность не требуется.CRC32 производит небольшое значение и очень быстро.

Скажем, ваша таблица выглядит следующим образом:

CREATE TABLE data (lots_of_text VARCHAR(500));

измените его на:

CREATE TABLE data (text_hash INT, lots_of_text VARCHAR(500), INDEX (text_hash));

икогда вы вставляете строки, вы делаете:

INSERT INTO data (lots_of_text, text_hash) 
VALUES ("lots and lots of text", CRC32("lots and lots of text"));

, а затем вы можете извлечь строки следующим образом:

SELECT lots_of_text FROM data
WHERE text_hash = CRC32("lots and lots of text")
AND lots_of_text = "lots and lots of text";

запрос будет использовать индекс на text_hash, но с CRC32не будет выдавать уникальные значения, вам все равно нужно проверить поле lots_of_text на равенство - но запрос все равно будет быстрым, поскольку не более нескольких строк будут иметь одинаковый хэш.

Вариант этого состоит виспользуйте первые 50 символов или около того в качестве хэша, число строк с одинаковыми первыми 50 символами, скорее всего, будет низким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...