MySQL эффективный запрос "выбрать идентификатор еще вставить" - PullRequest
2 голосов
/ 25 ноября 2008

У меня есть таблица MySQL, состоящая из:

CREATE TABLE `url_list` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `crc32` int(10) unsigned NOT NULL,
  `url` varchar(512) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `crc32` (`crc32`)
);

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

Если значение отсутствует, мне нужно его вставить, но использование таких структур, как INSERT IGNORE или ON DUPLICATE KEY, либо требует, чтобы я поместил уникальное значение в огромный varchar, либо не использует мои индекс.

Как я могу "ВЫБЕРИТЕ идентификатор еще, ВСТАВИТЬ", сохраняя при этом скорость поиска для 80-90% попаданий, которые уже есть в таблице?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2008

Я бы порекомендовал исключить столбец id и crc32, потому что они не нужны.

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

CREATE TABLE `url_list` (
  `url_hash` BINARY(16) NOT NULL PRIMARY KEY
  `url`      VARCHAR(512) NOT NULL
);

DELIM !!
CREATE TRIGGER `url_ins` BEFORE INSERT ON `url_list`
FOR EACH ROW
BEGIN
  SET NEW.`url_hash` = UNHEX( MD5( NEW.`url` ) );
END!!

Тогда вы можете использовать INSERT..ON DUPLICATE KEY UPDATE, потому что в отличие от crc32, хэш должен иметь очень низкий шанс столкновения.

edit: См. http://en.wikipedia.org/wiki/Birthday_attack. Если вы регистрируете 1 миллион различных URL-адресов в день в течение 2000 лет, MD5-хэши этих URL-адресов по-прежнему с меньшей вероятностью будут содержать конфликт, чем ваш жесткий диск. иметь неисправимую битовую ошибку.

1 голос
/ 25 ноября 2008

Этот веб-сайт предлагает решение аналогичной проблемы.

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