Мне нужно хранить потенциально 100 миллионов URL-адресов в базе данных. Каждый URL-адрес должен быть уникальным, поэтому я буду использовать ON DUPLICATE KEY UPDATE и подсчитать повторяющиеся URL-адреса.
Однако я не могу создать индекс в поле URL, так как мое поле varchar составляет 400 символов. MySQL жалуется и говорит; "# 1071 - Указанный ключ слишком длинный, максимальная длина ключа - 767 байт". (Varchar 400 займет 1200 байт)
Каков наилучший способ сделать это, если вам нужно обработать минимальные 500 000 URL-адресов в день на одном сервере?
Мы уже думаем, используя MongoDB для того же приложения, поэтому мы можем просто запросить MongoDB и найти дубликат URL-адреса и обновить строку. Тем не менее, я не сторонник решения этой проблемы с использованием MongoDB, и я хотел бы использовать только MySQL на этом этапе, поскольку я хотел бы быть как можно более легким в начале и быстрее завершить этот раздел проекта. (Мы еще не играли с MongoDB и не хотим тратить время на этом этапе)
Есть ли другая возможность сделать это, используя меньше ресурсов и времени. Я думал, чтобы получить хеш MD5 URL-адреса и сохранить его. И я могу сделать это поле УНИКАЛЬНЫМ. Я знаю, будет столкновение, но вполне нормально иметь 5-10-20 дубликатов в 100 миллионах URL-адресов, если это единственная проблема.
Есть ли у вас предложения? Я также не хочу тратить 10 секунд, чтобы вставить только один URL-адрес, так как он будет обрабатывать URL-адреса 500 тыс. В день.
Что бы вы предложили?
Изменить: согласно запросу это определение таблицы. (Я не использую MD5 на данный момент, это для тестирования)
mysql> DESC url;
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
| url_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| url_text | varchar(400) | NO | | | |
| md5 | varchar(32) | NO | UNI | | |
| insert_date | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| count | mediumint(9) unsigned | NO | | 0 | |
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.00 sec)