2008-11-25 2 views
2

У меня есть таблица MySQL, состоящая из: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 или не воспользовался моим индексом.

Как я могу «SELECT id else INSERT», сохраняя скорость поиска для 80-90% обращений, которые уже находятся в таблице?

+0

Возможный дубликат [Как проверить, существует ли значение, чтобы избежать дублирования?] (Http://stackoverflow.com/questions/61033/how-to-check-if-a-value-already-exists-to -avoid-duplicates) – outis 2012-01-24 02:06:30

ответ

3

Я бы порекомендовал вам поместить колонку 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, хэш должен иметь очень низкую вероятность столкновения.

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

+0

Я думал об использовании хэша, но мне не нравится практически часть практически уникальной. – 2008-11-25 16:28:01

Смежные вопросы